在Flask中使用同名但绑定不同的表

10 投票
1 回答
5741 浏览
提问于 2025-04-17 18:40

我有两个表,它们的名字是一样的,但在不同的数据库里:

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()的实例,你可以绕过这个问题。

撰写回答