我有两个共享相同名称但位于不同数据库中的表:
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对象上的选项和列。
有没有办法解决这个问题,而无需重命名我的一个表?
答案 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()
实例,您可以解决此问题。