2010-09-29 1 views
1

J'essaie actuellement de déplacer mes tables DB vers InnoDB à partir de MyISAM. J'ai des problèmes de synchronisation avec les requêtes et les tâches cron qui s'exécutent sur le serveur et qui entraînent des erreurs. Je suis certain que le soutien aux transactions m'aidera à résoudre le problème. Je suis donc en transition vers InnoDB.SQL Alchemy + Test du serveur Web avec InnoDB échoue

J'ai une suite de tests qui font des appels à notre API REST webservices et reçoivent des réponses XML. La suite de tests est assez complète. Elle est écrite en Python et utilise SQLAlchemy pour interroger les informations de la base de données. Cependant, lorsque je change les tables du système de MyISAM en InnoDB, les tests échouent. Cependant, les tests n'échouent pas parce que le système ne fonctionne pas, ils échouent parce que l'ORM n'interroge pas correctement les lignes de la base de données que je suis en train de tester. lorsque je parcours le code, je vois les résultats corrects, mais l'ORM ne renvoie pas les résultats corrects du tout.

flux de base est:

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' 

En utilisant les tables MyISAM pour stocker l'objet et ce test passera. Cependant, quand je change de tables InnoDB, ce test ne passera pas. Ce qui est plus intéressant, c'est que lorsque je parcours le code dans le débogueur, je peux voir que la base de données a ce que j'attends, donc ce n'est pas un problème dans le code du serveur web. J'ai essayé presque chaque combinaison de expire_all, autoflush, autocommit, etc. etc., et ne peux toujours pas passer ce test.

Je peux fournir plus d'informations si nécessaire.

Merci, Conrad

Répondre

1

Le problème est que vous mettez la ligne self.testId = testObject.id avant nouvel objet est ajouté à la session, rincée et SQLAlchemy ID attribué à elle. Ainsi self.testId est toujours None. Déplacez cette ligne ci-dessous session.commit().

Questions connexes