【发布时间】:2017-04-12 02:20:19
【问题描述】:
我对 Postgres 数据库有两个独立的 SQLAlchemy 接口。第一个接口,在 Flask App 的上下文中,包含这个模型:
app = create_app() # sets the SQLAlchemy Database URI, etc.
db = SQLAlchemy(app)
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
created_at = db.Column(db.DateTime, default=datetime.datetime.utcnow)
updated_at = db.Column(db.DateTime, onupdate=datetime.datetime.utcnow)
name = db.Column(db.String, nullable=False)
第二个接口不是通过 Flask 实现的——相反,它是一个侦听特定事件的脚本,在这种情况下,它旨在执行一些计算并更新数据库中的一行。为此,我让 SQLAlchemy 反映现有数据库:
from sqlalchemy import create_engine, MetaData, Table
from sqlalchemy.orm import mapper, sessionmaker
from sqlalchemy.ext.automap import automap_base
from os import environ
dbPath = "postgresql://" + ...
engine = create_engine(dbPath)
Base = automap_base()
Base.prepare(engine, reflect=True)
metadata = MetaData(engine)
class User(object):
pass
users = Table('user', metadata, autoload=True, autoload_with=engine)
mapper(User, users)
Session = sessionmaker(bind=engine)
session = Session()
我现在遇到的问题是:当我使用第一个界面创建新条目或更新条目时,一切正常,created_at 和 updated_at 字段已适当更新。
但是,当我使用第二个界面——导入代码并使用session.query(User) 获取条目并更新它时,updated_at 字段不会改变。此外,当我使用此接口创建新用户时,虽然它按预期创建了新行,但它既不填充 created_at 也不填充 updated_at 字段。
我的问题:
- 为什么会这样?为什么反射似乎破坏了
default/onupdate方法? - 我该如何解决这个问题?
【问题讨论】:
-
尽管脚本与flask app没有关联,但你也可以复用flask中用户模型的定义。
-
@stamaimer 是那种很好的形式吗?这种方法似乎会产生技术债务。
-
你听什么活动? event符合您的要求吗?
-
@stamaimer 不,我正在听一个与 sqlalchemy 无关的事件。我提供的代码是一个最小的工作示例。
标签: python postgresql flask sqlalchemy flask-sqlalchemy