在Flask中使用具有不同绑定的表的相同名称

时间:2013-03-11 10:54:57

标签: python flask sqlalchemy flask-sqlalchemy

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

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对象上的选项和列。

有没有办法解决这个问题,而无需重命名我的一个表?

1 个答案:

答案 0 :(得分:11)

对具有相同名称的不同数据库使用单独的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()实例,您可以解决此问题。