【问题标题】:Using same name of tables with different binds in Flask在 Flask 中使用具有不同绑定的相同名称的表
【发布时间】:2013-03-11 10:54:57
【问题描述】:

我有两个同名但位于不同数据库中的表:

class Lcn(db.Model):
    __tablename__ = 'lcn'

class LcnRemote(db.Model):
    __bind_key__ = 'remote'
    __tablename__ = 'lcn'

似乎 SQLAlchemy 不喜欢这样。它说:

sqlalchemy.exc.InvalidRequestError: 表 'lcn' 已为此 MetaData 实例定义。指定 'extend_existing=True' 以重新定义现有 Table 对象上的选项和列。

有没有办法解决这个问题而不必重命名我的一个表?

【问题讨论】:

标签: python flask sqlalchemy flask-sqlalchemy


【解决方案1】:

对同名的不同数据库使用单独的declarative base classes,以防止共享 SQLAlchemy 元数据。您必须创建两个 flask_sqlalchemy.SQLAlchemy() 实例:

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/database1.db'
app.config['SQLALCHEMY_BINDS'] = {'remote': 'sqlite:////tmp/database1.db'}

db1 = SQLAlchemy(app)

class Lcn(db1.Model):
    __tablename__ = 'lcn'

db2 = SQLAlchemy(app)

class LcnRemote(db2.Model):
    __bind_key__ = 'remote'
    __tablename__ = 'lcn'

这是 Flask-SQLAlchemy 的一个限制,它确实应该允许您为每个绑定创建声明性基础。 SQLAlchemy() 类当前的设计方式将其限制为一个这样的基础;它通过它在开始时生成的db.Model 类代理各种 SQLAlchemy 元数据调用。通过创建flask_sqlalchemy.SQLAlchemy()两个 实例,您可以解决此问题。

【讨论】:

  • 感谢分享这个 sn-p。我宁愿不必实例化两个不同的应用程序,但如果需要,那就这样吧。
  • @JureVrscaj:这确实是 Flask SQLAlchemy 的一个限制;我知道它支持多数据库绑定,但它应该真的为每个使用单独的元数据实例值。您也许可以在他们的issue tracker 中将其报告为错误。
  • @MartijnPieters 现在在烧瓶中修复了吗?
  • @ManuraOmal:修复将应用于 Flask SQLAlchemy 扩展,而不是 Flask 本身。我不知道项目是否解决了这个问题,在此期间我没有关注开发。
  • @ManuraOmal:我已经更新了我的解决方案以避免使用两个 Flask 应用程序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-23
  • 1970-01-01
  • 2020-04-04
  • 2020-08-17
  • 1970-01-01
  • 1970-01-01
  • 2018-08-12
相关资源
最近更新 更多