从Postgres加载Flask模型
我有一个用Flask搭建的应用,使用的是Postgres数据库和SQLAlchemy。不过,这不是flask-sqlalchemy这个扩展。虽然我能让应用在普通的SQLAlchemy下正常工作,但这个扩展似乎不太喜欢我们设置的数据库结构。我希望能利用这个扩展的一些功能,比如分页。
我有个问题...
我有一个可以和flask-sqlalchemy扩展一起使用的Postgres网址,但我不太确定该怎么处理模型。是不是要把每个表的Postgres结构都重新写成一个模型?
现在我有几个模型,看起来像这样:
class Account(Base):
users = relationship("User")
class User(Base):
account = relationship("Account", backref="user")
这样是可以正常工作的。虽然模型里没有定义一些额外的列,但我还是能访问到(比如User模型的名字、邮箱等)。我需要在模型里声明所有这些列才能使用flask-sqlalchemy扩展吗?
谢谢你的帮助。
3 个回答
试试使用 SQLACodeGen。只需要把它指向你的数据库,它就会为你生成所有的SQLAlchemy模型,然后你可以根据需要进行调整——这能节省很多时间。
如果你喜欢在运行时自动发现表格,SQLAlchemy也可以 反射已有的表格。
下面是一个使用SQLACodeGen的简单例子:
sqlacodegen postgresql:///example_database --tables car
输出结果:
# coding: utf-8
from sqlalchemy import Column, ForeignKey, Integer, String
from sqlalchemy.orm import relationship
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
metadata = Base.metadata
class Car(Base):
__tablename__ = 'car'
id = Column(Integer, primary_key=True)
price = Column(Integer)
color_id = Column(ForeignKey('color.id'))
color = relationship(u'Color')
class Color(Base):
__tablename__ = 'color'
id = Column(Integer, primary_key=True)
name = Column(String(50))
这个版本的sqlacodegen是一个为SQLAlchemy生成模型代码的工具。
它提供了一个选项,可以生成适用于Flask的模型代码,使用参数“--flask”。
我找到了解决办法。我的主要问题是我想使用flask-SQLAlchemy提供的分页和其他方法。我初始化数据库的方式和这个声明部分非常相似。
我关注的那行代码是:
Base.query = db_session.query_property()
结果发现,你可以给那个构造函数提供另一种实现,这样它就会调用你提供的实现。所以我导入了flask.ext.sqlalchemy.BaseQuery,并把它给了那个构造函数。
现在那行代码看起来是:
Base.query = db_session.query_property(BaseQuery)
这样我就能使用我想要的所有flask-sqlalchemy查询功能了!我觉得把这个分享出来,可能会帮助到其他遇到同样问题的人。