2012-03-18 1 views
0

Я пытаюсь изучить python, и я выбрал структуру Pyramid. Тем не менее, я не хотел использовать ORM, предоставленный sqlalchemy, а скорее написал чистый sql (хотя я все еще использую sqlalchemy). Я также использую khufu_sqlalchemy, чтобы настроить его.Как сделать INSERT в Pyramid с помощью khufu_sqlalchemy

Однако я не могу вставлять в базу данных. Сделка быть запущена, но она никогда не поручена ..
Моего код:

 
    db = dbsession(request) 
    db.execute('insert into users (email, password) values (:email, :password)' , {'email':email, 'password':password})

Есть ли способ Autocommit? Документация действительно редкий ..

ответ

1

khufu следует практике пирамиды использования диспетчера транзакций для обработки соединений с базой данных. Это означает, что в инициализации sessionmaker есть код (ZopeTransactionExtension), который перехватывает сеанс базы данных и отслеживает изменения. Когда изменения обнаружены, они будут автоматически зафиксированы в конце запроса, если ошибки не возникнут. Если вы обходите ORM и вызываете выполнение самостоятельно, вы можете: 1) отключить диспетчер транзакций и совершить вызов самостоятельно или 2) пометить сеанс как грязный после выполнения execute, чтобы соединение, по-видимому, изменилось и автоматически совершило совершение транзакции , Второй способ предпочтительнее, потому что, если вы вызываете коммит преждевременно, остальная часть кода может потерпеть неудачу, и все же данные все еще сохраняются в вашей базе данных. Чтобы сделать второй способ, используйте функцию mark_changed из расширения.

from zope.sqlalchemy import mark_changed 
session = DBSession() 
mark_changed(session) 

Как примечание стороны, если вы хотите, чтобы заставить сделку совершить до конца запроса, вы можете сделать это через

import transaction 
transaction.commit() 

Но опять же, это будет происходить автоматически на конец запроса, если ошибки не возникнут.

0

http://docs.sqlalchemy.org/en/latest/core/connections.html

db.commit() 

является то, что вы ищете. Проверьте дополнительную документацию для автообмена.

+0

Это не будет работать, если используется расширение транзакции. Это приведет к исключению, потому что менеджер транзакций обрабатывает транзакции для вас. –