在Flask中使用同名但绑定不同的表
我有两个表,它们的名字是一样的,但在不同的数据库里:
class Lcn(db.Model):
__tablename__ = 'lcn'
class LcnRemote(db.Model):
__bind_key__ = 'remote'
__tablename__ = 'lcn'
看起来SQLAlchemy不喜欢这样。它提示说:
sqlalchemy.exc.InvalidRequestError: 表'lcn'已经在这个MetaData实例中定义过了。请指定'extend_existing=True'来重新定义一个已存在的表对象的选项和列。
有没有办法解决这个问题,而不需要重命名我的其中一个表呢?
1 个回答
17
对于有相同表名的不同数据库,建议使用不同的声明基类,这样可以避免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()
的实例,你可以绕过这个问题。