想象一下,我的项目中有一个表,其中包含一些行。
例如:
# -*- coding: utf-8 -*-
import sqlalchemy as sa
from app import db
class Article(db.Model):
__tablename__ = 'article'
id = sa.Column(sa.Integer, primary_key=True, autoincrement=True)
name = sa.Column(sa.Unicode(255))
content = sa.Column(sa.UnicodeText)
我正在使用Flask-SQLAlchemy,因此db.session是作用域会话对象。
我在https://github.com/zzzeek/sqlalchemy/blob/master/examples/versioned_history/history_meta.py看到了
但我无法理解如何将它与我现有的表格一起使用,以及如何启动它。 (我在versioned_session func中传递ArgumentError: Session event listen on a scoped_session requires that its creation callable is associated with the Session class.
时出现db.session
错误
从版本控制中我需要以下内容:
1)查询旧版本的对象
2)在更改日期范围时查询旧版本
3)将旧状态恢复为现有对象
4)在创建版本时向历史表添加其他信息(例如编辑器user_id,date_edit,remote_ip)
请告诉我,我的案例最好的实践是什么,如果你能为它添加一些工作实例。
答案 0 :(得分:1)
您可以通过将事件处理程序附加到SignallingSession
类[1]而不是创建的会话对象来解决该错误:
from flask.ext.sqlalchemy import SignallingSession
from history_meta import versioned_session, Versioned
# Create your Flask app...
versioned_session(SignallingSession)
db = SQLAlchemy(app)
class Article(Versioned, db.Model):
__tablename__ = 'article'
id = sa.Column(sa.Integer, primary_key=True, autoincrement=True)
name = sa.Column(sa.Unicode(255))
content = sa.Column(sa.UnicodeText)
示例代码创建了带有_history
后缀和额外changed
日期时间列的并行表。查询旧版本只需要查看该表。
为了管理额外的字段,我会把它们放在你的主表上,并且它们会在历史表中自动跟踪。
[1]注意,如果您覆盖SQLAlchemy.create_session()
以使用其他会话类,则应调整传递给versioned_session
的班级。
答案 1 :(得分:0)
我认为问题是你遇到了这个错误:https://github.com/mitsuhiko/flask-sqlalchemy/issues/182
一种解决方法是停止使用flask-sqlalchemy并自行配置sqlalchemy。