Sql Alchemy Duplicated Commit - PullRequest
       5

Sql Alchemy Duplicated Commit

1 голос
/ 21 июня 2011

В настоящее время я столкнулся с проблемой в моем приложении Cherrypy. Я являюсь моим собственным модулем сеанса, при выполнении session.add () один и тот же объект обновляется дважды.

cherrypy.request.SessionManager.user_data = user

try:

    db_session.add(cherrypy.request.SessionManager)
    db_session.commit()

Вернется

2011-06-21 09:16:48,991 INFO sqlalchemy.engine.base.Engine.0x...04cL BEGIN (implicit)
2011-06-21 09:16:49,015 INFO sqlalchemy.engine.base.Engine.0x...04cL SELECT ..... 
FROM "Clients_Users" 
WHERE "Clients_Users".username = %(username_1)s AND "Clients_Users".password = %(password_1)s 
LIMIT 1 OFFSET 0
2011-06-21 09:16:49,015 INFO sqlalchemy.engine.base.Engine.0x...04cL {'password_1': '123', 'username_1': u'1'}
2011-06-21 09:16:49,047 INFO sqlalchemy.engine.base.Engine.0x...04cL UPDATE "SYS_Sessions" SET user_data=%(user_data)s WHERE "SYS_Sessions".id = %(SYS_Sessions_id)s
2011-06-21 09:16:49,067 INFO sqlalchemy.engine.base.Engine.0x...04cL {'SYS_Sessions_id': 92L, 'user_data': <psycopg2._psycopg.Binary object at 0x8a7c06c>}
2011-06-21 09:16:49,071 INFO sqlalchemy.engine.base.Engine.0x...04cL COMMIT
2011-06-21 09:16:49,093 INFO sqlalchemy.engine.base.Engine.0x...04cL BEGIN (implicit)
2011-06-21 09:16:49,095 INFO sqlalchemy.engine.base.Engine.0x...04cL UPDATE "SYS_Sessions" SET user_data=%(user_data)s WHERE "SYS_Sessions".id = %(SYS_Sessions_id)s
2011-06-21 09:16:49,095 INFO sqlalchemy.engine.base.Engine.0x...04cL {'SYS_Sessions_id': 92L, 'user_data': <psycopg2._psycopg.Binary object at 0x8a8424c>}
2011-06-21 09:16:49,108 INFO sqlalchemy.engine.base.Engine.0x...04cL COMMIT

Кто-нибудь видел это раньше?

P.S Это не происходит в остальных модулях, которые я сделал.

Ответы [ 2 ]

1 голос
/ 08 августа 2011

Хорошо, извините за такую ​​большую задержку, но я был в отпуске.

В любом случае, чтобы предотвратить двойное принятие, вам нужно удалить объект из сеанса, и вы делаете это с помощью session.expunge().

Еще одна вещь.

Использование session.merge() Позволит вам повторно использовать удаленный объект.

Надеюсь, что это поможет кому-то нуждающемуся.

PS: Имейте в виду, что объект может плохо себя вести или что любой будущий патч с алхимией может нарушить совместимость.

1 голос
/ 21 июня 2011

Вы можете попытаться добавить user_data в сеанс, а не добавлять сам объект SessionManager в сеанс.По крайней мере, это сделало бы отладку более простой.

Как таковой, я не уверен, есть ли у вас сеанс базы данных внутри cherrypy SessionManager - что может показаться нежелательным, но, возможно, sqlalchemy справится с этим (?)Или, возможно, вносите множественные изменения в объект, которые не могут быть выполнены в одно и то же время в базе данных - например, возможно, именно так выглядят некоторые каскады с включенным эхом (?).Какую ценность каскада вы используете?

Я не уверен, что обновляется во второй раз после чтения sql.Похоже, что-то неявное.Вам, вероятно, нужно показать часть кода для этих объектов или часть кода, которая заставляет обновление получить лучший ответ.Но, возможно, вышеупомянутая интуиция будет полезна.Удачи

...