Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 8 additions & 16 deletions piccolo/columns/m2m.py
Original file line number Diff line number Diff line change
Expand Up @@ -93,59 +93,51 @@ def get_select_string(
if engine_type in ("postgres", "cockroach"):
if self.as_list:
column_name = self.columns[0]._meta.db_column_name
return QueryString(
f"""
return QueryString(f"""
ARRAY(
SELECT
"inner_{table_2_name}"."{column_name}"
FROM {inner_select}
) AS "{m2m_relationship_name}"
"""
)
""")
elif not self.serialisation_safe:
column_name = table_2_pk_name
return QueryString(
f"""
return QueryString(f"""
ARRAY(
SELECT
"inner_{table_2_name}"."{column_name}"
FROM {inner_select}
) AS "{m2m_relationship_name}"
"""
)
""")
else:
column_names = ", ".join(
f'"inner_{table_2_name}"."{column._meta.db_column_name}"'
for column in self.columns
)
return QueryString(
f"""
return QueryString(f"""
(
SELECT JSON_AGG({m2m_relationship_name}_results)
FROM (
SELECT {column_names} FROM {inner_select}
) AS "{m2m_relationship_name}_results"
) AS "{m2m_relationship_name}"
"""
)
""")
elif engine_type == "sqlite":
if len(self.columns) > 1 or not self.serialisation_safe:
column_name = table_2_pk_name
else:
assert len(self.columns) > 0
column_name = self.columns[0]._meta.db_column_name

return QueryString(
f"""
return QueryString(f"""
(
SELECT group_concat(
"inner_{table_2_name}"."{column_name}"
)
FROM {inner_select}
)
AS "{m2m_relationship_name} [M2M]"
"""
)
""")
else:
raise ValueError(f"{engine_type} is an unrecognised engine type")

Expand Down
2 changes: 1 addition & 1 deletion piccolo/utils/list.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@


def flatten(
items: Sequence[Union[ElementType, list[ElementType]]]
items: Sequence[Union[ElementType, list[ElementType]]],
) -> list[ElementType]:
"""
Takes a sequence of elements, and flattens it out. For example::
Expand Down
2 changes: 1 addition & 1 deletion requirements/dev-requirements.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
black==24.3.0
black==26.3.1
ipdb==0.13.9
ipython>=7.31.1
flake8==6.1.0
Expand Down
6 changes: 2 additions & 4 deletions tests/apps/migrations/auto/integration/test_migrations.py
Original file line number Diff line number Diff line change
Expand Up @@ -1089,8 +1089,7 @@ def test_target_column(self):
self.assertTrue(table_class.table_exists().run_sync())

# Make sure the constraint was created correctly.
response = self.run_sync(
"""
response = self.run_sync("""
SELECT EXISTS(
SELECT 1
FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE CCU
Expand All @@ -1101,8 +1100,7 @@ def test_target_column(self):
AND CCU.TABLE_NAME = 'table_a'
AND CCU.COLUMN_NAME = 'name'
)
"""
)
""")
self.assertTrue(response[0]["exists"])


Expand Down
108 changes: 36 additions & 72 deletions tests/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -248,98 +248,75 @@ def create_tables(self):
assert ENGINE is not None

if ENGINE.engine_type in ("postgres", "cockroach"):
self.run_sync(
"""
self.run_sync("""
CREATE TABLE manager (
id SERIAL PRIMARY KEY,
name VARCHAR(50)
);"""
)
self.run_sync(
"""
);""")
self.run_sync("""
CREATE TABLE band (
id SERIAL PRIMARY KEY,
name VARCHAR(50),
manager INTEGER REFERENCES manager,
popularity SMALLINT
);"""
)
self.run_sync(
"""
);""")
self.run_sync("""
CREATE TABLE ticket (
id SERIAL PRIMARY KEY,
price NUMERIC(5,2)
);"""
)
self.run_sync(
"""
);""")
self.run_sync("""
CREATE TABLE poster (
id SERIAL PRIMARY KEY,
content TEXT
);"""
)
self.run_sync(
"""
);""")
self.run_sync("""
CREATE TABLE shirt (
id SERIAL PRIMARY KEY,
size VARCHAR(1)
);"""
)
);""")
elif ENGINE.engine_type == "sqlite":
self.run_sync(
"""
self.run_sync("""
CREATE TABLE manager (
id INTEGER PRIMARY KEY,
name VARCHAR(50)
);"""
)
self.run_sync(
"""
);""")
self.run_sync("""
CREATE TABLE band (
id INTEGER PRIMARY KEY,
name VARCHAR(50),
manager INTEGER REFERENCES manager,
popularity SMALLINT
);"""
)
self.run_sync(
"""
);""")
self.run_sync("""
CREATE TABLE ticket (
id SERIAL PRIMARY KEY,
price NUMERIC(5,2)
);"""
)
self.run_sync(
"""
);""")
self.run_sync("""
CREATE TABLE poster (
id SERIAL PRIMARY KEY,
content TEXT
);"""
)
self.run_sync(
"""
);""")
self.run_sync("""
CREATE TABLE shirt (
id SERIAL PRIMARY KEY,
size VARCHAR(1)
);"""
)
);""")
else:
raise Exception("Unrecognised engine")

def insert_row(self):
assert ENGINE is not None

if ENGINE.engine_type == "cockroach":
id = self.run_sync(
"""
id = self.run_sync("""
INSERT INTO manager (
name
) VALUES (
'Guido'
) RETURNING id;"""
)
self.run_sync(
f"""
) RETURNING id;""")
self.run_sync(f"""
INSERT INTO band (
name,
manager,
Expand All @@ -348,19 +325,15 @@ def insert_row(self):
'Pythonistas',
{id[0]["id"]},
1000
);"""
)
);""")
else:
self.run_sync(
"""
self.run_sync("""
INSERT INTO manager (
name
) VALUES (
'Guido'
);"""
)
self.run_sync(
"""
);""")
self.run_sync("""
INSERT INTO band (
name,
manager,
Expand All @@ -369,15 +342,13 @@ def insert_row(self):
'Pythonistas',
1,
1000
);"""
)
);""")

def insert_rows(self):
assert ENGINE is not None

if ENGINE.engine_type == "cockroach":
id = self.run_sync(
"""
id = self.run_sync("""
INSERT INTO manager (
name
) VALUES (
Expand All @@ -386,10 +357,8 @@ def insert_rows(self):
'Graydon'
),(
'Mads'
) RETURNING id;"""
)
self.run_sync(
f"""
) RETURNING id;""")
self.run_sync(f"""
INSERT INTO band (
name,
manager,
Expand All @@ -406,11 +375,9 @@ def insert_rows(self):
'CSharps',
{id[2]["id"]},
10
);"""
)
);""")
else:
self.run_sync(
"""
self.run_sync("""
INSERT INTO manager (
name
) VALUES (
Expand All @@ -419,10 +386,8 @@ def insert_rows(self):
'Graydon'
),(
'Mads'
);"""
)
self.run_sync(
"""
);""")
self.run_sync("""
INSERT INTO band (
name,
manager,
Expand All @@ -439,8 +404,7 @@ def insert_rows(self):
'CSharps',
3,
10
);"""
)
);""")

def insert_many_rows(self, row_count=10000):
"""
Expand Down
10 changes: 2 additions & 8 deletions tests/table/test_insert.py
Original file line number Diff line number Diff line change
Expand Up @@ -253,18 +253,12 @@ def test_target_string(self):
"""
Band = self.Band

constraint_name = [
i["constraint_name"]
for i in Band.raw(
"""
constraint_name = [i["constraint_name"] for i in Band.raw("""
SELECT constraint_name
FROM information_schema.constraint_column_usage
WHERE column_name = 'name'
AND table_name = 'band';
"""
).run_sync()
if i["constraint_name"].endswith("_key")
][0]
""").run_sync() if i["constraint_name"].endswith("_key")][0]

query = Band.insert(Band(name=self.band.name)).on_conflict(
target=constraint_name,
Expand Down
6 changes: 2 additions & 4 deletions tests/table/test_select.py
Original file line number Diff line number Diff line change
Expand Up @@ -688,8 +688,7 @@ def test_count_column_group_by(self):
"""
self.insert_rows()
self.insert_rows()
self.run_sync(
"""
self.run_sync("""
INSERT INTO band (
name,
manager,
Expand All @@ -698,8 +697,7 @@ def test_count_column_group_by(self):
'SomeBand',
null,
1000
);"""
)
);""")

response = (
Band.select(Band.manager.name, Count(Band.manager))
Expand Down
Loading