Sqlalchemy SQL炼金术+;使用InnoDB测试Web服务器失败

Sqlalchemy SQL炼金术+;使用InnoDB测试Web服务器失败,sqlalchemy,innodb,Sqlalchemy,Innodb,我目前正试图将我的DB表从MyISAM移到InnoDB。我在服务器上运行的请求和cron作业出现计时问题,这导致了一些错误。我确信事务支持将帮助我解决这个问题。因此,我正在过渡到InnoDB 我有一套测试,可以调用我们的WebServicesRESTAPI并接收XML响应。测试套件相当全面,它是用Python编写的,并使用SQLAlchemy从数据库查询信息。但是,当我将系统中的表从MyISAM更改为InnoDB时,测试开始失败。但是,测试并不是因为系统不工作而失败,而是因为ORM没有正确地查询

我目前正试图将我的DB表从MyISAM移到InnoDB。我在服务器上运行的请求和cron作业出现计时问题,这导致了一些错误。我确信事务支持将帮助我解决这个问题。因此,我正在过渡到InnoDB

我有一套测试,可以调用我们的WebServicesRESTAPI并接收XML响应。测试套件相当全面,它是用Python编写的,并使用SQLAlchemy从数据库查询信息。但是,当我将系统中的表从MyISAM更改为InnoDB时,测试开始失败。但是,测试并不是因为系统不工作而失败,而是因为ORM没有正确地查询我正在测试的数据库中的行。当我逐步浏览代码时,我看到了正确的结果,但是ORM根本没有返回正确的结果

基本流程是:

class UnitTest(unittest.TestCase):                                                                               
    def setUp(self):            
        # Create a test object in DB that gets affected by the web server                                                                                 
        testObject = Obj(foo='one')                                                                              
        self.testId = testObject.id

        session.add(testObject)                                                                                  
        session.commit()                                                                                         

    def tearDown(self):
        # Clean up after the test
        testObject = session.query(Obj).get(self.testId)                                                         

        session.delete(testObject)                                                                               
        session.commit()  

    def test_web_server(self):
        # Ensure the initial state of the object.                                                                                   
        objects = session.query(Obj).get(self.testId)    
        assert objects.foo == 'one'                                                                              

        # This will make a simple HTTP get call on an url that will modify the DB
        response = server.request.increment_foo(self.testId)

        # This one fails, the object still has a foo of 'one'                                                    
        # When I stop here in a debugger though, and look at the database,
        # The row in question actually has the correct value in the database.
        # ????
        objects = session.query(Obj).get(self.testId)                                                            
        assert objects.foo == 'two'
使用MyISAM表存储对象,此测试将通过。但是,当我切换到InnoDB表时,这个测试将不会通过。更有趣的是,当我在调试器中单步执行代码时,我可以看到datbase具有我所期望的内容,因此它在web服务器代码中不是问题。我尝试了几乎所有的expire\u all、autoflush、autocommit等组合,但仍然无法通过此测试

如有必要,我可以提供更多信息

谢谢,
Conrad

问题在于,在将新对象添加到会话、刷新和SQLAlchemy为其分配id之前,先放置行
self.testId=testObject.id
。因此,
self.testId
总是
None
。将这一行移到会话.commit()下的
session()
问题是,在将新对象添加到会话、刷新并为其分配SQLAlchemy id之前,您需要将这一行放入self.testId=testObject.id。因此,
self.testId
总是
None
。将此行移到会话.commit()下的