9

同じ名前を共有しているが、異なるデータベースにある2つのテーブルがあります。

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

class LcnRemote(db.Model):
    __bind_key__ = 'remote'
    __tablename__ = 'lcn'

SQLAlchemyはそれを好まないようです。それは言う:

sqlalchemy.exc.InvalidRequestError:テーブル'lcn'はこのMetaDataインスタンスに対してすでに定義されています。'extend_existing = True'を指定して、既存のTableオブジェクトのオプションと列を再定義します。

テーブルの1つを名前変更せずにこれを解決する方法はありますか?

4

1 に答える 1

16

SQLAlchemyメタデータの共有を防ぐために、同じ名前の異なるデータベースに個別の宣言型基本クラスを使用します。flask_sqlalchemy.SQLAlchemy()2つのインスタンスを作成する必要があります。

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()クラスが現在設計されている方法では、そのようなベースが1つだけに制限されています。db.Model開始時に生成するクラスを介して、さまざまなSQLAlchemyメタデータ呼び出しをプロキシします。2つのインスタンスを作成するflask_sqlalchemy.SQLAlchemy()ことで、この問題を回避できます。

于 2013-03-12T11:04:24.033 に答える