【问题标题】:Loading Flask Models from Postgres从 Postgres 加载 Flask 模型
【发布时间】:2014-05-20 17:52:22
【问题描述】:

我有一个使用 postgres db 和 sqlalchemy 设置的 Flask 应用程序。不幸的是,这不是 flask-sqlalchemy 扩展。虽然我能够让该应用程序与常规 sqlalchemy 一起使用,但该扩展程序似乎并不喜欢我们设置的模式。我希望利用扩展程序的一些功能,例如分页。

这是我的问题...

我有一个可以与 flask-sqlalchemy 扩展一起使用的 postgres URL,但我不确定如何处理模型。我是否只是重新输入所有 postgres 架构作为每个表的模型?

现在我有几个模型,看起来像:

class Account(Base):
    users = relationship("User")

class User(Base):
    account = relationship("Account", backref="user")

这很好用。模型中未定义其他列,但我可以访问(例如用户模型的名称、电子邮件等)。我是否需要在模型中声明所有这些才能使用 flask-sqlalchemy 扩展?

感谢您的帮助。

【问题讨论】:

    标签: python postgresql flask flask-sqlalchemy


    【解决方案1】:

    用于 SQLAlchemy 的 sqlacodegen 模型代码生成器的变体

    为烧瓶模型生成提供和选项“--flask”

    https://github.com/ksindi/flask-sqlacodegen

    【讨论】:

      【解决方案2】:

      尝试使用SQLACodeGen。只需将其指向您的数据库,它就会为您生成所有 SQLA 模型,然后您可以根据需要对其进行调整——这样可以节省大量时间。

      如果您更喜欢在运行时发现路由,SQLAlchemy 也可以reflect existing tables

      这是一个使用 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))
      

      【讨论】:

        【解决方案3】:

        我想出了一个解决办法。我的主要问题是我想使用flask-SQLAlchemy 提供的分页和其他方法。我对数据库的初始化与this 声明部分非常相似。

        感兴趣的路线是:

        Base.query = db_session.query_property()
        

        事实证明,您可以给该构造函数另一个实现,它会调用它。所以我导入了 flask.ext.sqlalchemy.BaseQuery 并给了它。

        该行现在看起来像:

        Base.query = db_session.query_property(BaseQuery)
        

        我能够使用我想要的所有 flask-sqlalchemy 查询功能!我想我会在这里发布,以防其他人遇到问题。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-07-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多