From b670f4ae3b9bd1d84dfe88f86bcaf96d04ce2a6b Mon Sep 17 00:00:00 2001 From: hoonhout Date: Fri, 10 Feb 2023 11:36:58 +0100 Subject: [PATCH 01/16] MovedIn20Warning: The ``declarative_base()`` function is now available as sqlalchemy.orm.declarative_base() --- src/zope/sqlalchemy/README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/zope/sqlalchemy/README.rst b/src/zope/sqlalchemy/README.rst index 1fa8c8e..7af78ff 100644 --- a/src/zope/sqlalchemy/README.rst +++ b/src/zope/sqlalchemy/README.rst @@ -96,7 +96,7 @@ This example is lifted directly from the SQLAlchemy declarative documentation. First the necessary imports. >>> from sqlalchemy import * - >>> from sqlalchemy.ext.declarative import declarative_base + >>> from sqlalchemy.orm import declarative_base >>> from sqlalchemy.orm import scoped_session, sessionmaker, relation >>> from zope.sqlalchemy import register >>> import transaction From 5b1213b2bba2347ba58c35ee2ea807d9204be075 Mon Sep 17 00:00:00 2001 From: hoonhout Date: Fri, 10 Feb 2023 11:37:39 +0100 Subject: [PATCH 02/16] RemovedIn20Warning: Passing a string to Connection.execute() is deprecated and will be removed in version 2.0. Use the text() construct, or the Connection.exec_driver_sql() method to invoke a driver-level SQL string --- src/zope/sqlalchemy/tests.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/zope/sqlalchemy/tests.py b/src/zope/sqlalchemy/tests.py index f0eab37..4c95bd9 100644 --- a/src/zope/sqlalchemy/tests.py +++ b/src/zope/sqlalchemy/tests.py @@ -253,7 +253,7 @@ def testAbortBeforeCommit(self): transaction.begin() session = Session() conn = session.connection() - conn.execute("SELECT 1 FROM test_users") + conn.execute(sa.text("SELECT 1 FROM test_users")) mark_changed(session) transaction.commit() @@ -267,7 +267,7 @@ def testAbortAfterCommit(self): conn = session.connection() # At least PostgresSQL requires a rollback after invalid SQL is # executed - self.assertRaises(Exception, conn.execute, "BAD SQL SYNTAX") + self.assertRaises(Exception, conn.execute, sa.text("BAD SQL SYNTAX")) mark_changed(session) try: # Thus we could fail in commit @@ -280,7 +280,7 @@ def testAbortAfterCommit(self): transaction.begin() session = Session() conn = session.connection() - conn.execute("SELECT 1 FROM test_users") + conn.execute(sa.text("SELECT 1 FROM test_users")) mark_changed(session) transaction.commit() @@ -746,7 +746,7 @@ def testRetryThread(self): len(s1.query(User).all()) == 1, "Users table should have one row" ) tm2.begin() - s2.connection().execute("SET TRANSACTION ISOLATION LEVEL SERIALIZABLE") + s2.connection().execute(sa.text("SET TRANSACTION ISOLATION LEVEL SERIALIZABLE")) self.assertTrue( len(s2.query(User).all()) == 1, "Users table should have one row" ) From 2093312ea069d5a4974b4b57c86eeaeb09229eff Mon Sep 17 00:00:00 2001 From: hoonhout Date: Fri, 10 Feb 2023 11:39:16 +0100 Subject: [PATCH 03/16] RemovedIn20Warning: The FromClause.select().whereclause parameter is deprecated and will be removed in version 2.0. Please make use of the Select.where() method to add WHERE criteria to the SELECT statement --- src/zope/sqlalchemy/tests.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/zope/sqlalchemy/tests.py b/src/zope/sqlalchemy/tests.py index 4c95bd9..ef754e2 100644 --- a/src/zope/sqlalchemy/tests.py +++ b/src/zope/sqlalchemy/tests.py @@ -593,7 +593,7 @@ def testBulkUpdate(self): session.query(User).update(dict(lastname="smith")) transaction.commit() results = engine.connect().execute( - test_users.select(test_users.c.lastname == "smith") + test_users.select().where(test_users.c.lastname == "smith") ) self.assertEqual(len(results.fetchall()), 2) @@ -617,7 +617,7 @@ def testBulkUpdateUsingRegister(self): session.query(User).update(dict(lastname="smith")) transaction.commit() results = engine.connect().execute( - test_users.select(test_users.c.lastname == "smith") + test_users.select().where(test_users.c.lastname == "smith") ) self.assertEqual(len(results.fetchall()), 2) From 45f9222651b6183703197680c4509bd9cae51ab6 Mon Sep 17 00:00:00 2001 From: hoonhout Date: Fri, 10 Feb 2023 11:39:33 +0100 Subject: [PATCH 04/16] RemovedIn20Warning: The legacy calling style of select() is deprecated and will be removed in SQLAlchemy 2.0. Please use the new calling style described at select() --- src/zope/sqlalchemy/tests.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/zope/sqlalchemy/tests.py b/src/zope/sqlalchemy/tests.py index ef754e2..2e9dab9 100644 --- a/src/zope/sqlalchemy/tests.py +++ b/src/zope/sqlalchemy/tests.py @@ -302,7 +302,7 @@ def testSimplePopulation(self): d, {"firstname": "udo", "lastname": "juergens", "id": 1}) # bypass the session machinery - stmt = sql.select(test_users.columns).order_by("id") + stmt = sql.select(*test_users.columns).order_by("id") conn = session.connection() results = conn.execute(stmt) self.assertEqual( From e6345a0c9497899eef501084fb88c11f3c335bc2 Mon Sep 17 00:00:00 2001 From: hoonhout Date: Fri, 10 Feb 2023 11:39:58 +0100 Subject: [PATCH 05/16] RemovedIn20Warning: The Query.get() method is considered legacy as of the 1.x series of SQLAlchemy and becomes a legacy construct in 2.0. The method is now available as Session.get() --- src/zope/sqlalchemy/tests.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/zope/sqlalchemy/tests.py b/src/zope/sqlalchemy/tests.py index 2e9dab9..09b813f 100644 --- a/src/zope/sqlalchemy/tests.py +++ b/src/zope/sqlalchemy/tests.py @@ -659,7 +659,7 @@ def testKeepSession(self): with transaction.manager: session.add(User(id=1, firstname="foo", lastname="bar")) - user = session.query(User).get(1) + user = session.get(User, 1) # if the keep_session works correctly, this transaction will not # close the session after commit @@ -680,7 +680,7 @@ def testExpireAll(self): transaction.commit() session = Session() - instance = session.query(User).get(1) + instance = session.get(User, 1) transaction.commit() # No work, session.close() self.assertEqual(sa.inspect(instance).expired, True) @@ -724,7 +724,7 @@ def testRetry(self): len(s2.query(User).all()) == 1, "Users table should have one row" ) s1.query(User).delete() - user = s2.query(User).get(1) + user = s2.get(User, 1) user.lastname = "smith" tm1.commit() raised = False From 3ae4946de912bf91c2baec8ad581ab578999b94a Mon Sep 17 00:00:00 2001 From: hoonhout Date: Fri, 10 Feb 2023 11:40:14 +0100 Subject: [PATCH 06/16] RemovedIn20Warning: The relation construct is considered legacy as of the 1.x series of SQLAlchemy and will be removed in 2.0. Please use relationship() --- src/zope/sqlalchemy/tests.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/zope/sqlalchemy/tests.py b/src/zope/sqlalchemy/tests.py index 09b813f..140ed97 100644 --- a/src/zope/sqlalchemy/tests.py +++ b/src/zope/sqlalchemy/tests.py @@ -154,7 +154,7 @@ def setup_mappers(): User, test_users, properties={ - "skills": orm.relation( + "skills": orm.relationship( Skill, primaryjoin=( test_users.columns["id"] == test_skills.columns["user_id"] From b86b881510af4b3c56a660f4f337028aecb3bb3e Mon Sep 17 00:00:00 2001 From: hoonhout Date: Fri, 10 Feb 2023 11:42:12 +0100 Subject: [PATCH 07/16] RemovedIn20Warning: This Session located a target engine via bound metadata; as this functionality will be removed in SQLAlchemy 2.0, an Engine object should be passed to the Session() constructor directly --- src/zope/sqlalchemy/tests.py | 44 ++++++++++++++++++++---------------- 1 file changed, 25 insertions(+), 19 deletions(-) diff --git a/src/zope/sqlalchemy/tests.py b/src/zope/sqlalchemy/tests.py index 140ed97..4183793 100644 --- a/src/zope/sqlalchemy/tests.py +++ b/src/zope/sqlalchemy/tests.py @@ -127,14 +127,14 @@ def connect(dbapi_connection, connection_record): sa.ForeignKeyConstraint(("user_id",), ("test_users.id",)), ) -bound_metadata1 = sa.MetaData(engine) -bound_metadata2 = sa.MetaData(engine2) +metadata1 = sa.MetaData() +metadata2 = sa.MetaData() test_one = sa.Table( - "test_one", bound_metadata1, sa.Column("id", sa.Integer, primary_key=True) + "test_one", metadata1, sa.Column("id", sa.Integer, primary_key=True) ) test_two = sa.Table( - "test_two", bound_metadata2, sa.Column("id", sa.Integer, primary_key=True) + "test_two", metadata2, sa.Column("id", sa.Integer, primary_key=True) ) @@ -146,11 +146,13 @@ class TestTwo(SimpleModel): pass +mapper_registry = orm.registry() + def setup_mappers(): - orm.clear_mappers() - # Other tests can clear mappers by calling clear_mappers(), + mapper_registry.dispose() + # Other tests can clear mappers by calling mapper_registry.dispose(), # be more robust by setting up mappers in the test setup. - m1 = orm.mapper( + m1 = mapper_registry.map_imperatively( User, test_users, properties={ @@ -162,10 +164,10 @@ def setup_mappers(): ) }, ) - m2 = orm.mapper(Skill, test_skills) + m2 = mapper_registry.map_imperatively(Skill, test_skills) - m3 = orm.mapper(TestOne, test_one) - m4 = orm.mapper(TestTwo, test_two) + m3 = mapper_registry.map_imperatively(TestOne, test_one) + m4 = mapper_registry.map_imperatively(TestTwo, test_two) return [m1, m2, m3, m4] @@ -226,7 +228,7 @@ def setUp(self): def tearDown(self): transaction.abort() metadata.drop_all(engine) - orm.clear_mappers() + mapper_registry.dispose() def testMarkUnknownSession(self): import zope.sqlalchemy.datamanager @@ -709,7 +711,7 @@ def tearDown(self): self.tm1.abort() self.tm2.abort() metadata.drop_all(engine) - orm.clear_mappers() + mapper_registry.dispose() def testRetry(self): # sqlite is unable to run this test as the databse is locked @@ -774,24 +776,28 @@ def target(): class MultipleEngineTests(unittest.TestCase): def setUp(self): self.mappers = setup_mappers() - bound_metadata1.drop_all() - bound_metadata1.create_all() - bound_metadata2.drop_all() - bound_metadata2.create_all() + metadata1.drop_all(engine) + metadata1.create_all(engine) + metadata2.drop_all(engine2) + metadata2.create_all(engine2) def tearDown(self): transaction.abort() - bound_metadata1.drop_all() - bound_metadata2.drop_all() - orm.clear_mappers() + metadata1.drop_all(engine) + metadata2.drop_all(engine2) + mapper_registry.dispose() def testTwoEngines(self): session = UnboundSession() + session.bind_table(TestOne, bind=engine) + session.bind_table(TestTwo, bind=engine2) session.add(TestOne(id=1)) session.add(TestTwo(id=2)) session.flush() transaction.commit() session = UnboundSession() + session.bind_table(TestOne, bind=engine) + session.bind_table(TestTwo, bind=engine2) rows = session.query(TestOne).all() self.assertEqual(len(rows), 1) rows = session.query(TestTwo).all() From d68cd91f4aefe80353e518f68e42193c0ac48361 Mon Sep 17 00:00:00 2001 From: Bas Hoonhout Date: Fri, 10 Feb 2023 12:06:55 +0100 Subject: [PATCH 08/16] Remove sqla version pin --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index b36d7d1..b55a405 100644 --- a/setup.py +++ b/setup.py @@ -47,7 +47,7 @@ python_requires='>=3.7', install_requires=[ 'setuptools', - 'SQLAlchemy>=1.1,!=1.4.0,!=1.4.1,!=1.4.2,!=1.4.3,!=1.4.4,!=1.4.5,!=1.4.6,<2', # noqa: E501 line too long + 'SQLAlchemy>=1.1,!=1.4.0,!=1.4.1,!=1.4.2,!=1.4.3,!=1.4.4,!=1.4.5,!=1.4.6', # noqa: E501 line too long 'transaction>=1.6.0', 'zope.interface>=3.6.0', ], From 3d35e9b7f11ccf5ddb070ab07e1d7cef648affdd Mon Sep 17 00:00:00 2001 From: hoonhout Date: Fri, 10 Feb 2023 13:15:09 +0100 Subject: [PATCH 09/16] Linting --- src/zope/sqlalchemy/tests.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/zope/sqlalchemy/tests.py b/src/zope/sqlalchemy/tests.py index 4183793..aeaf1a3 100644 --- a/src/zope/sqlalchemy/tests.py +++ b/src/zope/sqlalchemy/tests.py @@ -148,6 +148,7 @@ class TestTwo(SimpleModel): mapper_registry = orm.registry() + def setup_mappers(): mapper_registry.dispose() # Other tests can clear mappers by calling mapper_registry.dispose(), @@ -748,7 +749,9 @@ def testRetryThread(self): len(s1.query(User).all()) == 1, "Users table should have one row" ) tm2.begin() - s2.connection().execute(sa.text("SET TRANSACTION ISOLATION LEVEL SERIALIZABLE")) + s2.connection().execute( + sa.text("SET TRANSACTION ISOLATION LEVEL SERIALIZABLE") + ) self.assertTrue( len(s2.query(User).all()) == 1, "Users table should have one row" ) From 201dfe0fb0231d05eb06bb45755f1a775b74aad5 Mon Sep 17 00:00:00 2001 From: hoonhout Date: Fri, 10 Feb 2023 13:15:22 +0100 Subject: [PATCH 10/16] Add SQLA 20 test case --- tox.ini | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tox.ini b/tox.ini index 7be2b35..b0bb06e 100644 --- a/tox.ini +++ b/tox.ini @@ -12,7 +12,7 @@ envlist = coverage py{37,38,39}-sqlalchemy11 py{37,38,39,310}-sqlalchemy{12,13} - py{37,38,39,310,311}-sqlalchemy{14} + py{37,38,39,310,311}-sqlalchemy{14,20} [testenv] skip_install = true @@ -23,6 +23,7 @@ deps = sqlalchemy12: SQLAlchemy==1.2.* sqlalchemy13: SQLAlchemy==1.3.* sqlalchemy14: SQLAlchemy==1.4.* + sqlalchemy20: SQLAlchemy==2.0.* commands_pre = sh -c 'if [ '{env:CI:false}' = 'true' ]; then {envbindir}/buildout -nc {toxinidir}/github_actions.cfg buildout:directory={envdir} buildout:develop={toxinidir} ; fi' sh -c 'if [ '{env:CI:false}' != 'true' ]; then {envbindir}/buildout -nc {toxinidir}/postgres.cfg buildout:directory={envdir} buildout:develop={toxinidir} ; fi' From 85cea8989cad4bf408ae6b93a78162e517ce3e08 Mon Sep 17 00:00:00 2001 From: hoonhout Date: Fri, 10 Feb 2023 13:26:20 +0100 Subject: [PATCH 11/16] Update README.rst --- src/zope/sqlalchemy/README.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/zope/sqlalchemy/README.rst b/src/zope/sqlalchemy/README.rst index 7af78ff..d06b4d3 100644 --- a/src/zope/sqlalchemy/README.rst +++ b/src/zope/sqlalchemy/README.rst @@ -97,7 +97,7 @@ First the necessary imports. >>> from sqlalchemy import * >>> from sqlalchemy.orm import declarative_base - >>> from sqlalchemy.orm import scoped_session, sessionmaker, relation + >>> from sqlalchemy.orm import scoped_session, sessionmaker, relationship >>> from zope.sqlalchemy import register >>> import transaction @@ -108,7 +108,7 @@ Now to define the mapper classes. ... __tablename__ = 'test_users' ... id = Column('id', Integer, primary_key=True) ... name = Column('name', String(50)) - ... addresses = relation("Address", backref="user") + ... addresses = relationship("Address", backref="user") >>> class Address(Base): ... __tablename__ = 'test_addresses' ... id = Column('id', Integer, primary_key=True) @@ -146,7 +146,7 @@ machinery, just as Zope's publisher would. Engine level connections are outside the scope of the transaction integration. - >>> engine.connect().execute('SELECT * FROM test_users').fetchall() + >>> engine.connect().execute(text('SELECT * FROM test_users')).fetchall() [(1, ...'bob')] A new transaction requires a new session. Let's add an address. From a5d1e4825e868fd5234022c8f2cec9477118a677 Mon Sep 17 00:00:00 2001 From: hoonhout Date: Fri, 10 Feb 2023 13:36:28 +0100 Subject: [PATCH 12/16] Update README.rst --- src/zope/sqlalchemy/README.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/zope/sqlalchemy/README.rst b/src/zope/sqlalchemy/README.rst index d06b4d3..0e4f7bd 100644 --- a/src/zope/sqlalchemy/README.rst +++ b/src/zope/sqlalchemy/README.rst @@ -187,7 +187,7 @@ to the DB. >>> session = Session() >>> conn = session.connection() >>> users = Base.metadata.tables['test_users'] - >>> conn.execute(users.update(users.c.name=='bob'), name='ben') + >>> conn.execute(users.update(users).where(users.c.name=='bob'), name='ben') >>> from zope.sqlalchemy import mark_changed >>> mark_changed(session) @@ -205,7 +205,7 @@ session in the 'changed' state initially. >>> session = Session() >>> conn = session.connection() - >>> conn.execute(users.update(users.c.name=='ben'), name='bob') + >>> conn.execute(users.update(users).where(users.c.name=='ben'), name='bob') >>> transaction.commit() >>> session = Session() From 8ec18c9c35c51e6b96583782cd756e27110a1e0b Mon Sep 17 00:00:00 2001 From: hoonhout Date: Fri, 10 Feb 2023 13:39:14 +0100 Subject: [PATCH 13/16] Update README.rst --- src/zope/sqlalchemy/README.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/zope/sqlalchemy/README.rst b/src/zope/sqlalchemy/README.rst index 0e4f7bd..45323d0 100644 --- a/src/zope/sqlalchemy/README.rst +++ b/src/zope/sqlalchemy/README.rst @@ -187,7 +187,7 @@ to the DB. >>> session = Session() >>> conn = session.connection() >>> users = Base.metadata.tables['test_users'] - >>> conn.execute(users.update(users).where(users.c.name=='bob'), name='ben') + >>> conn.execute(users.update().where(users.c.name=='bob'), name='ben') >>> from zope.sqlalchemy import mark_changed >>> mark_changed(session) @@ -205,7 +205,7 @@ session in the 'changed' state initially. >>> session = Session() >>> conn = session.connection() - >>> conn.execute(users.update(users).where(users.c.name=='ben'), name='bob') + >>> conn.execute(users.update().where(users.c.name=='ben'), name='bob') >>> transaction.commit() >>> session = Session() From 9cc73b44910e86879dbd14ad281aba2a793f511f Mon Sep 17 00:00:00 2001 From: hoonhout Date: Fri, 10 Feb 2023 13:44:04 +0100 Subject: [PATCH 14/16] Update README.rst --- src/zope/sqlalchemy/README.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/zope/sqlalchemy/README.rst b/src/zope/sqlalchemy/README.rst index 45323d0..e62ff3e 100644 --- a/src/zope/sqlalchemy/README.rst +++ b/src/zope/sqlalchemy/README.rst @@ -187,7 +187,7 @@ to the DB. >>> session = Session() >>> conn = session.connection() >>> users = Base.metadata.tables['test_users'] - >>> conn.execute(users.update().where(users.c.name=='bob'), name='ben') + >>> conn.execute(users.update().where(users.c.name=='bob').values(name='ben')) >>> from zope.sqlalchemy import mark_changed >>> mark_changed(session) @@ -205,7 +205,7 @@ session in the 'changed' state initially. >>> session = Session() >>> conn = session.connection() - >>> conn.execute(users.update().where(users.c.name=='ben'), name='bob') + >>> conn.execute(users.update().where(users.c.name=='ben').values(name='bob')) >>> transaction.commit() >>> session = Session() From bc8e03fb0d383d7b4085e6c4cbc73033f72d5bc6 Mon Sep 17 00:00:00 2001 From: hoonhout Date: Mon, 13 Feb 2023 13:00:12 +0100 Subject: [PATCH 15/16] Add fallbacks/mocks for SQLA==1.2 --- src/zope/sqlalchemy/README.rst | 5 ++++- src/zope/sqlalchemy/tests.py | 23 ++++++++++++++++++----- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/src/zope/sqlalchemy/README.rst b/src/zope/sqlalchemy/README.rst index e62ff3e..732f161 100644 --- a/src/zope/sqlalchemy/README.rst +++ b/src/zope/sqlalchemy/README.rst @@ -96,10 +96,13 @@ This example is lifted directly from the SQLAlchemy declarative documentation. First the necessary imports. >>> from sqlalchemy import * - >>> from sqlalchemy.orm import declarative_base >>> from sqlalchemy.orm import scoped_session, sessionmaker, relationship >>> from zope.sqlalchemy import register >>> import transaction + >>> try: + ... from sqlalchemy.orm import declarative_base + ... except ImportError: + ... from sqlalchemy.ext.declarative import declarative_base Now to define the mapper classes. diff --git a/src/zope/sqlalchemy/tests.py b/src/zope/sqlalchemy/tests.py index aeaf1a3..5ab2222 100644 --- a/src/zope/sqlalchemy/tests.py +++ b/src/zope/sqlalchemy/tests.py @@ -146,7 +146,17 @@ class TestTwo(SimpleModel): pass -mapper_registry = orm.registry() +try: + mapper_registry = orm.registry() +except AttributeError: + class MockMapperRegistry: + def map_imperatively(self, *args, **kwargs): + return orm.mapper(*args, **kwargs) + + def dispose(self, *args, **kwargs): + return orm.clear_mappers(*args, **kwargs) + + mapper_registry = MockMapperRegistry() def setup_mappers(): @@ -305,7 +315,10 @@ def testSimplePopulation(self): d, {"firstname": "udo", "lastname": "juergens", "id": 1}) # bypass the session machinery - stmt = sql.select(*test_users.columns).order_by("id") + try: + stmt = sql.select(*test_users.columns).order_by("id") + except exc.ArgumentError: + stmt = sql.select(test_users.columns).order_by("id") conn = session.connection() results = conn.execute(stmt) self.assertEqual( @@ -662,7 +675,7 @@ def testKeepSession(self): with transaction.manager: session.add(User(id=1, firstname="foo", lastname="bar")) - user = session.get(User, 1) + user = session.query(User).filter(User.id == 1).one() # if the keep_session works correctly, this transaction will not # close the session after commit @@ -683,7 +696,7 @@ def testExpireAll(self): transaction.commit() session = Session() - instance = session.get(User, 1) + instance = session.query(User).filter(User.id == 1).one() transaction.commit() # No work, session.close() self.assertEqual(sa.inspect(instance).expired, True) @@ -727,7 +740,7 @@ def testRetry(self): len(s2.query(User).all()) == 1, "Users table should have one row" ) s1.query(User).delete() - user = s2.get(User, 1) + user = s2.query(User).filter(User.id == 1).one() user.lastname = "smith" tm1.commit() raised = False From f5ec4a57ce5fbbbc771bbfc89adc0004049ab865 Mon Sep 17 00:00:00 2001 From: hoonhout Date: Wed, 15 Feb 2023 15:56:02 +0100 Subject: [PATCH 16/16] Revert "Add SQLA 20 test case" This reverts commit 201dfe0fb0231d05eb06bb45755f1a775b74aad5. --- tox.ini | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tox.ini b/tox.ini index b0bb06e..7be2b35 100644 --- a/tox.ini +++ b/tox.ini @@ -12,7 +12,7 @@ envlist = coverage py{37,38,39}-sqlalchemy11 py{37,38,39,310}-sqlalchemy{12,13} - py{37,38,39,310,311}-sqlalchemy{14,20} + py{37,38,39,310,311}-sqlalchemy{14} [testenv] skip_install = true @@ -23,7 +23,6 @@ deps = sqlalchemy12: SQLAlchemy==1.2.* sqlalchemy13: SQLAlchemy==1.3.* sqlalchemy14: SQLAlchemy==1.4.* - sqlalchemy20: SQLAlchemy==2.0.* commands_pre = sh -c 'if [ '{env:CI:false}' = 'true' ]; then {envbindir}/buildout -nc {toxinidir}/github_actions.cfg buildout:directory={envdir} buildout:develop={toxinidir} ; fi' sh -c 'if [ '{env:CI:false}' != 'true' ]; then {envbindir}/buildout -nc {toxinidir}/postgres.cfg buildout:directory={envdir} buildout:develop={toxinidir} ; fi'