Sql Alchemy Duplicated Commit

1

В настоящее время я сталкиваюсь с проблемой в своем приложении Cherrypy. Im мой собственный пользовательский модуль сеанса, при выполнении 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

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

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

Теги:
sqlalchemy
commit

2 ответа

1
Лучший ответ

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

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

Еще кое-что.

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

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

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

1

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню