diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2019-02-13 11:26:54 -0500 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2019-02-13 11:26:54 -0500 |
| commit | 71d642711d26ee8e1e7e8b19d70be8be1eca22eb (patch) | |
| tree | edaf76ca61a1cd35ee365cf99ddd3fd745358877 /test | |
| parent | 5cc5234e0b065907deb2765249dde1c526fe5c89 (diff) | |
| download | sqlalchemy-71d642711d26ee8e1e7e8b19d70be8be1eca22eb.tar.gz | |
Set IDENTITY_INSERT for insert.values({column: expr})
Fixed bug where the SQL Server "IDENTITY_INSERT" logic that allows an INSERT
to proceed with an explicit value on an IDENTITY column was not detecting
the case where :meth:`.Insert.values` were used with a dictionary that
contained a :class:`.Column` as key and a SQL expression as a value.
Fixes: #4499
Change-Id: Ia61cd6524b030b40a665db9c20771f0c5aa5fcd7
Diffstat (limited to 'test')
| -rw-r--r-- | test/dialect/mssql/test_query.py | 85 | ||||
| -rw-r--r-- | test/orm/test_unitofwork.py | 2 |
2 files changed, 61 insertions, 26 deletions
diff --git a/test/dialect/mssql/test_query.py b/test/dialect/mssql/test_query.py index 46af4658d..bf836fc14 100644 --- a/test/dialect/mssql/test_query.py +++ b/test/dialect/mssql/test_query.py @@ -7,6 +7,7 @@ from sqlalchemy import event from sqlalchemy import ForeignKey from sqlalchemy import func from sqlalchemy import Integer +from sqlalchemy import literal from sqlalchemy import MetaData from sqlalchemy import or_ from sqlalchemy import PrimaryKeyConstraint @@ -172,36 +173,68 @@ class IdentityInsertTest(fixtures.TestBase, AssertsCompiledSQL): ) def test_execute(self): - cattable.insert().values(id=9, description="Python").execute() + with testing.db.connect() as conn: + conn.execute(cattable.insert().values(id=9, description="Python")) - cats = cattable.select().order_by(cattable.c.id).execute() - eq_([(9, "Python")], list(cats)) + cats = conn.execute(cattable.select().order_by(cattable.c.id)) + eq_([(9, "Python")], list(cats)) - result = cattable.insert().values(description="PHP").execute() - eq_([10], result.inserted_primary_key) - lastcat = cattable.select().order_by(desc(cattable.c.id)).execute() - eq_((10, "PHP"), lastcat.first()) + result = conn.execute(cattable.insert().values(description="PHP")) + eq_([10], result.inserted_primary_key) + lastcat = conn.execute( + cattable.select().order_by(desc(cattable.c.id)) + ) + eq_((10, "PHP"), lastcat.first()) def test_executemany(self): - cattable.insert().execute( - [ - {"id": 89, "description": "Python"}, - {"id": 8, "description": "Ruby"}, - {"id": 3, "description": "Perl"}, - {"id": 1, "description": "Java"}, - ] - ) - cats = cattable.select().order_by(cattable.c.id).execute() - eq_( - [(1, "Java"), (3, "Perl"), (8, "Ruby"), (89, "Python")], list(cats) - ) - cattable.insert().execute( - [{"description": "PHP"}, {"description": "Smalltalk"}] - ) - lastcats = ( - cattable.select().order_by(desc(cattable.c.id)).limit(2).execute() - ) - eq_([(91, "Smalltalk"), (90, "PHP")], list(lastcats)) + with testing.db.connect() as conn: + conn.execute( + cattable.insert(), + [ + {"id": 89, "description": "Python"}, + {"id": 8, "description": "Ruby"}, + {"id": 3, "description": "Perl"}, + {"id": 1, "description": "Java"}, + ], + ) + cats = conn.execute(cattable.select().order_by(cattable.c.id)) + eq_( + [(1, "Java"), (3, "Perl"), (8, "Ruby"), (89, "Python")], + list(cats), + ) + conn.execute( + cattable.insert(), + [{"description": "PHP"}, {"description": "Smalltalk"}], + ) + lastcats = conn.execute( + cattable.select().order_by(desc(cattable.c.id)).limit(2) + ) + eq_([(91, "Smalltalk"), (90, "PHP")], list(lastcats)) + + def test_insert_plain_param(self): + with testing.db.connect() as conn: + conn.execute(cattable.insert(), id=5) + eq_(conn.scalar(select([cattable.c.id])), 5) + + def test_insert_values_key_plain(self): + with testing.db.connect() as conn: + conn.execute(cattable.insert().values(id=5)) + eq_(conn.scalar(select([cattable.c.id])), 5) + + def test_insert_values_key_expression(self): + with testing.db.connect() as conn: + conn.execute(cattable.insert().values(id=literal(5))) + eq_(conn.scalar(select([cattable.c.id])), 5) + + def test_insert_values_col_plain(self): + with testing.db.connect() as conn: + conn.execute(cattable.insert().values({cattable.c.id: 5})) + eq_(conn.scalar(select([cattable.c.id])), 5) + + def test_insert_values_col_expression(self): + with testing.db.connect() as conn: + conn.execute(cattable.insert().values({cattable.c.id: literal(5)})) + eq_(conn.scalar(select([cattable.c.id])), 5) class QueryUnicodeTest(fixtures.TestBase): diff --git a/test/orm/test_unitofwork.py b/test/orm/test_unitofwork.py index dc8a818d2..d6ca16600 100644 --- a/test/orm/test_unitofwork.py +++ b/test/orm/test_unitofwork.py @@ -479,6 +479,8 @@ class ForeignPKTest(fixtures.MappedTest): class ClauseAttributesTest(fixtures.MappedTest): + __backend__ = True + @classmethod def define_tables(cls, metadata): Table( |
