los*_*rje 5 python sqlalchemy flask flask-sqlalchemy
Flask-SQLAlchemy 对 SQLAlchemy 反射的支持似乎不太适合我。我有一个观点my_view想通过 进行反思autoload。
但我想my_view成为一个丰富的对象并具有各种功能,所以我想my_view子类化db.Model。我希望它像任何其他非视图的数据库模型一样工作。
我这样做:
class MyView(db.Model):
__tablename__ = 'my_view',
__table_args__ = (
db.UniqueConstraint('id', 'start_date'),
{
'autoload': True,
'autoload_with': db.engine
}
)
...my column defs...
...extra functionality...
Run Code Online (Sandbox Code Playgroud)
但在应用程序引导期间我收到错误:
<snip>
File "env/lib/python3.4/site-packages/sqlalchemy/dialects/postgresql/base.py", line 2325, in get_columns
info_cache=kw.get('info_cache'))
File "<string>", line 2, in get_table_oid
File "env/lib/python3.4/site-packages/sqlalchemy/engine/reflection.py", line 54, in cache
ret = fn(self, con, *args, **kw)
File "env/lib/python3.4/site-packages/sqlalchemy/dialects/postgresql/base.py", line 2223, in get_table_oid
raise exc.NoSuchTableError(table_name)
sqlalchemy.exc.NoSuchTableError: ('my_view',)
Run Code Online (Sandbox Code Playgroud)
但是,如果我使用它db.Table而不是db.Model它的工作原理:
MyView = db.Table(
'my_view',
db.metadata,
...my column defs...
autoload=True,
autoload_with=db.engine
)
Run Code Online (Sandbox Code Playgroud)
我真的很想拥有一个对象并使用db.Model它,这样我就可以实现__eq__()并__json__()能够执行以下操作:
my_view_rows = session.query(MyView)\
.order_by(MyView.column_a)\
.all()
Run Code Online (Sandbox Code Playgroud)
有人知道为什么db.Model我的代码版本不起作用吗?我需要做什么才能使其正常工作?
使用 __table__ 代替 __tablename__ 和 __table_args__ 是有效的。
class MyView(db.Model):
__table__ = db.Table(
'my_view', db.metadata,
db.Column('other_table_id', db.Integer, db.ForeignKey('other_table.id'), primary_key=True),
...other column defs...
autoload=True,
autoload_with=db.engine
)
other_table = db.relationship('OtherTable')
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3040 次 |
| 最近记录: |