9

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

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

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

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

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

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

4

1 回答 1

16

为具有相同名称的不同数据库使用单独的声明性基类,以防止共享 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()解决此问题。

于 2013-03-12T11:04:24.033 回答