SQLAlchemy не будет обновлять мою базу данных

Я создаю приложение Pyramid с использованием SQLAlchemy-0.7.8. Я использую 64-битный Python3.2.

Вопрос в том, почему следующая функция ничего не передает в базу данных?

def create_card(sText,sCard):
    """
    create a wildcard instance if all is well (ie,sCard match in sText)
    return 
        oCard, dCard
    otherwise return False,False
    """
    oMatch = re.search(sCard,sText)
    if oMatch:
        oCard = WildCard()
        #set up some stuff about the WildCard

        DBSession.add(oCard)
        DBSession.flush()
        dCard = {
                    'id'            : oCard.id,
                    'span'          : oMatch.span(),
                    'card'          : oCard.card_string,
                            }
        return oCard,dCard
    return False,False  

Я импортирую DBSession из другого скрипта. это определяется следующим образом:

DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))

Вот некоторая справочная информация:

Приложение, которое я создаю, должно использоваться для характеристики больших блоков HTML с помощью регулярных выражений. Если приложение застревает и думает, что должно быть соответствие wilcard для фрагмента текста, тогда пользователю дается небольшая форма для заполнения. Как только форма зафиксирована, вызывается create_card. Если подстановочный знак сопоставляется со строкой, то создается экземпляр подстановочного знака.

Класс WildCard не является чем-то особенным, он просто хранит строку и несколько целых чисел. Если я распечатаю dCard, похоже, что WildCard был успешно передан, потому что у него целочисленный идентификатор. Если я не вызываю flush в сеансе базы данных, то dCard ['id'] равно None.

поле id выглядит следующим образом:

id = Column(Integer,Sequence('wild_seq'), primary_key=True)

Строки add и flush приводят к следующему выводу консоли:

2012-09-16 12:30:34,845 INFO  [sqlalchemy.engine.base.Engine][Dummy-2] INSERT INTO wildcard_wildcards (card_string, range_id, brand_id, category_id, group_cat_map_id, heading_group_id, heading_to_grp_map_id, heading_id, value_map_id, igneore_match) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
2012-09-16 12:30:34,845 INFO  [sqlalchemy.engine.base.Engine][Dummy-2] ('sCard contents', None, None, None, None, None, None, None, None, 0)

Так что до этого момента все вело себя так, как и ожидалось.

Вот проблема: Несмотря на то, что экземпляр WildCard выглядит так, как будто он был зафиксирован в базе данных, и исключений не возникает, непосредственное изучение базы данных показывает, что никаких изменений не сделано.

замена flush () на commit () вызывает следующее исключение:

AssertionError: Transaction must be committed using the transaction manager
12 голосов | спросил Sheena 16 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowSun, 16 Sep 2012 14:34:31 +0400 2012, 14:34:31

1 ответ


0

Вам необходимо зафиксировать вашу транзакцию.

Вы можете сделать это явно (вызвав DBSession.commit() или используя pyramid_tm middleware ; последний фиксирует транзакции автоматически при успешных ответах (с ответом HTTP 2xx).

Последний фиксирует транзакции для SQLAlchemy только в том случае, если вы используете расширение ZopeTransactionExtension с создателем сеанса:

from zope.sqlalchemy import ZopeTransactionExtension

DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))

Если вы уже используете ZopeTransactionExtension и хотите явно зафиксировать свои транзакции, вам нужно использовать transaction пакет:     импортная транзакция

transaction.commit()
ответил Martijn Pieters 16 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowSun, 16 Sep 2012 14:36:48 +0400 2012, 14:36:48

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132