【发布时间】: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