python - SQLAlchemy 事件不工作

标签 python python-2.7 sqlalchemy

我正在使用 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。

最佳答案

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

关于python - SQLAlchemy 事件不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34774218/

相关文章:

free pascal 中的 Python+Numpy 模块

python-2.7 - 使用 pip 安装包的问题

python - 检查目录是否是符号链接(symbolic link)?

python - jupyter notebook 不断重新连接

python - Sqlalchemy 选择条件

python - 我如何在 Python 中进行 "override"深度复制?

python - 使用在线编译器播放音频

python - 替换列表中的多个单词

sqlalchemy - Flask-SQLAlchemy 按多个聚合进行分组

python 和 sll/Exchange 2007 : No suitable authentication method found