【问题标题】:SQLAlchemy events are not workingSQLAlchemy 事件不起作用
【发布时间】:2016-04-18 20:55:20
【问题描述】:

我正在使用 SQLAlchemy 并尝试将事件添加到我的代码中。虽然一切正常,但事件没有被触发。这是我的简化代码:

from sqlalchemy import Column, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy import event

alchemy_base = declarative_base()

class Person(alchemy_base):
    __tablename__ = 'my_table'
    name = Column(String, primary_key=True)

@event.listens_for(Person, "before_insert")
def before_insert(mapper, connection, instance):
    print("before_insert", mapper, connection, instance)

engine = create_engine('sqlite:///:memory:', echo=True)
alchemy_base.metadata.create_all(engine)
session_maker = sessionmaker(bind=engine)
session = session_maker()

insert_dicts = [{'name': "ami"}, {'name': "beni"}]
engine.execute(Person.__table__.insert(), insert_dicts)
session.commit()

没有调用函数before_insert,尽管值已输入到数据库中。

我在 Mac OS 上使用 python 2.7.10,SQLAlchemy 1.0.10。

【问题讨论】:

  • 这对我来说是正确的。您确定在最初设置事件时为 mapper, connection, instance 传递了正确的值吗?
  • @Jeff-Widman:映射器、连接、实例是before_insert 的参数,我没有传递它们,当调用before_insert 时它们应该具有有效值(但它不会被调用)。设置活动应由@event.listens_for 完成。
  • 你是对的,我的错。我想知道这是否与您插入的方式有关?也许使用__table__.insert() API 会绕过事件系统?您是否尝试过使用 SQLAlchemy Core 的官方 API 调用插入 Person?

标签: python python-2.7 sqlalchemy


【解决方案1】:

before_insert 是一个 ORM 事件。您使用的是 SQLAlchemy Core 而不是 ORM。这行得通。

>>> p = Person(name='Ami')
>>> session.add(p)
>>> session.commit()
2016-01-13 23:37:42,887 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
('before_insert', <Mapper at 0x1059e4dd0; Person>, <sqlalchemy.engine.base.Connection object at 0x105a2e990>, <__main__.Person object at 0x105a2e790>)
2016-01-13 23:37:42,888 INFO sqlalchemy.engine.base.Engine INSERT INTO my_table (name) VALUES (?)
2016-01-13 23:37:42,888 INFO sqlalchemy.engine.base.Engine ('Ami',)
2016-01-13 23:37:42,888 INFO sqlalchemy.engine.base.Engine COMMIT

【讨论】:

  • 你是对的,这些监听器并不适用于所有级别的 sqlalchemy。这在文档中的任何地方都没有提到。如果您将此作为答案发布,我会接受。
  • 如何在 orm 中做到这一点?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-04
  • 2013-05-19
  • 2018-04-01
  • 2012-09-17
  • 2020-11-26
  • 2015-11-08
  • 2018-07-09
相关资源
最近更新 更多