From 6ac4f753e4c142a1a217c7a923f40dce0f206617 Mon Sep 17 00:00:00 2001 From: Bedram Tamang Date: Thu, 18 Jun 2026 19:44:40 -0700 Subject: [PATCH 1/2] fix: add insert_format/bulk_insert_format to PostgresGrammar PostgresGrammar was missing insert_format() and bulk_insert_format(), which BaseGrammar._compile_bulk_create() relies on. Seeders using the Postgres grammar crashed with AttributeError on bulk_insert_format. Adds both methods, mirroring the MySQL/SQLite/MSSQL grammars. --- .../masoniteorm/query/grammars/PostgresGrammar.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/query/grammars/PostgresGrammar.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/query/grammars/PostgresGrammar.py index b4416353..3281b829 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/query/grammars/PostgresGrammar.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/query/grammars/PostgresGrammar.py @@ -50,6 +50,12 @@ def update_format(self): def delete_format(self): return "DELETE FROM {table} {wheres}" + def insert_format(self): + return "INSERT INTO {table} ({columns}) VALUES ({values})" + + def bulk_insert_format(self): + return "INSERT INTO {table} ({columns}) VALUES {values}" + def aggregate_string_with_alias(self): return "{aggregate_function}({column}) AS {alias}" From 716886379434a29ee0afaf8d08c514011e2258cf Mon Sep 17 00:00:00 2001 From: Bedram Tamang Date: Thu, 18 Jun 2026 19:48:48 -0700 Subject: [PATCH 2/2] test: cover PostgresGrammar insert/bulk_insert format methods Adds a grammar-level unit test (no live Postgres connection) verifying insert_format() and bulk_insert_format() return the expected SQL, plus a regression test that compile('bulk_create') builds a multi-row INSERT without raising AttributeError. --- .../masoniteorm/postgres/grammar/__init__.py | 0 .../grammar/test_postgres_insert_grammar.py | 36 +++++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 fastapi_startkit/tests/masoniteorm/postgres/grammar/__init__.py create mode 100644 fastapi_startkit/tests/masoniteorm/postgres/grammar/test_postgres_insert_grammar.py diff --git a/fastapi_startkit/tests/masoniteorm/postgres/grammar/__init__.py b/fastapi_startkit/tests/masoniteorm/postgres/grammar/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/fastapi_startkit/tests/masoniteorm/postgres/grammar/test_postgres_insert_grammar.py b/fastapi_startkit/tests/masoniteorm/postgres/grammar/test_postgres_insert_grammar.py new file mode 100644 index 00000000..382daf0d --- /dev/null +++ b/fastapi_startkit/tests/masoniteorm/postgres/grammar/test_postgres_insert_grammar.py @@ -0,0 +1,36 @@ +import unittest + +from fastapi_startkit.masoniteorm.query.grammars.PostgresGrammar import PostgresGrammar + + +class TestPostgresInsertGrammar(unittest.TestCase): + """Grammar-level unit tests — no live Postgres connection required.""" + + def test_insert_format_is_defined(self): + result = PostgresGrammar().insert_format() + self.assertEqual(result, "INSERT INTO {table} ({columns}) VALUES ({values})") + + def test_bulk_insert_format_is_defined(self): + result = PostgresGrammar().bulk_insert_format() + self.assertEqual(result, "INSERT INTO {table} ({columns}) VALUES {values}") + + def test_compile_bulk_create_builds_multi_row_insert(self): + # Regression: PostgresGrammar previously lacked bulk_insert_format(), + # so compiling a bulk create raised AttributeError. + rows = [ + {"name": "Joe", "email": "joe@example.com"}, + {"name": "Bob", "email": "bob@example.com"}, + ] + grammar = PostgresGrammar(columns=rows, table="users") + + sql = grammar.compile("bulk_create")._sql + + self.assertEqual( + sql, + 'INSERT INTO "users" ("name", "email") VALUES ' + "('Joe', 'joe@example.com'), ('Bob', 'bob@example.com')", + ) + + +if __name__ == "__main__": + unittest.main()