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

Jur*_* V. 9 python sqlalchemy flask flask-sqlalchemy

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

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

class LcnRemote(db.Model):
    __bind_key__ = 'remote'
    __tablename__ = 'lcn'
Run Code Online (Sandbox Code Playgroud)

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

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

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

Mar*_*ers 11

对具有相同名称的不同数据库使用单独的声明性基类,以防止共享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'
Run Code Online (Sandbox Code Playgroud)

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