Flask-Migrate multidb foreign key to different bind cannot find target table
Flask-Migrate multidb foreign key to different bind can not find target table
我正在尝试使用 flask-sqlalchemy __binds__
功能将 Flask-Migrate 与多个数据库一起使用。当尝试在两个不同的绑定之间建立外键时,flask db migrate
失败并出现错误 sqlalchemy.exc.NoReferencedTableError
,即无法找到 table 来建立外键。
我正在使用带有绑定键 db1
和 db2
的 Postgres 数据库。请注意,如果外键指向同一绑定(数据库)上的 table,则不会发生此错误。
这是一个演示问题的示例应用程序:
app/models.py
from app import db
class People(db.Model):
__bind_key__ = 'db1'
id = db.Column(db.Integer, primary_key=True)
class Cats(db.Model):
__bind_key__ = 'db2'
id = db.Column(db.Integer, primary_key=True)
people_id = db.Column(db.Integer, db.ForeignKey('people.id'))
dogs_id = db.Column(db.Integer, db.ForeignKey('dogs.id'))
class Dogs(db.Model):
__bind_key__ = 'db2'
id = db.Column(db.Integer, primary_key=True)
app/init.py
from flask import Flask
from config import Config
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
app = Flask(__name__)
app.config.from_object(Config)
db = SQLAlchemy(app)
migrate = Migrate(app,db)
from app import models
一个config.py
文件用于设置来自环境变量的sqlalchemy绑定:
config.py
import os
basedir = os.path.abspath(os.path.dirname(__file__))
class Config(object):
SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL')
SQLALCHEMY_BINDS = {
'db1': os.environ.get('DATABASE_1_URL'),
'db2': os.environ.get('DATABASE_2_URL')}
本例中Cats
table到Dogs
table的外键建立无误:
dogs_id = db.Column(db.Integer, db.ForeignKey('dogs.id'))
但是对 People
table,
做同样的事情
people_id = db.Column(db.Integer, db.ForeignKey('people.id'))
当 运行 flask db migrate
:
时导致错误
sqlalchemy.exc.NoReferencedTableError: Foreign key associated with column 'cats.people_id' could not find table 'people' with which to generate a foreign key to target column 'id'
线程,例如this one表示外键应该通过包含架构名称或绑定键来建立:
people_id = db.Column(db.Integer, db.ForeignKey('db1.people.id'))
但是,这会导致相同的错误:
sqlalchemy.exc.NoReferencedTableError: Foreign key associated with column 'cats.people_id' could not find table 'db1.people' with which to generate a foreign key to target column 'id'
如有任何建议,我们将不胜感激!
问题是您不能跨数据库定义外键。如果您可以将所有这些表移动到一个数据库中,也许将它们放在不同的模式中,那么您会没事的。
你应该设置 schema
并用它设置外键。
class People(db.Model):
__bind_key__ = 'db1'
__table_args__ = {'schema': 'db1'}
id = db.Column(db.Integer, primary_key=True)
class Cats(db.Model):
__bind_key__ = 'db2'
__table_args__ = {'schema': 'db2'}
id = db.Column(db.Integer, primary_key=True)
people_id = db.Column(db.Integer, db.ForeignKey('db1.people.id'))
dogs_id = db.Column(db.Integer, db.ForeignKey('db2.dogs.id'))
class Dogs(db.Model):
__bind_key__ = 'db2'
__table_args__ = {'schema': 'db2'}
id = db.Column(db.Integer, primary_key=True)
我正在尝试使用 flask-sqlalchemy __binds__
功能将 Flask-Migrate 与多个数据库一起使用。当尝试在两个不同的绑定之间建立外键时,flask db migrate
失败并出现错误 sqlalchemy.exc.NoReferencedTableError
,即无法找到 table 来建立外键。
我正在使用带有绑定键 db1
和 db2
的 Postgres 数据库。请注意,如果外键指向同一绑定(数据库)上的 table,则不会发生此错误。
这是一个演示问题的示例应用程序:
app/models.py
from app import db
class People(db.Model):
__bind_key__ = 'db1'
id = db.Column(db.Integer, primary_key=True)
class Cats(db.Model):
__bind_key__ = 'db2'
id = db.Column(db.Integer, primary_key=True)
people_id = db.Column(db.Integer, db.ForeignKey('people.id'))
dogs_id = db.Column(db.Integer, db.ForeignKey('dogs.id'))
class Dogs(db.Model):
__bind_key__ = 'db2'
id = db.Column(db.Integer, primary_key=True)
app/init.py
from flask import Flask
from config import Config
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
app = Flask(__name__)
app.config.from_object(Config)
db = SQLAlchemy(app)
migrate = Migrate(app,db)
from app import models
一个config.py
文件用于设置来自环境变量的sqlalchemy绑定:
config.py
import os
basedir = os.path.abspath(os.path.dirname(__file__))
class Config(object):
SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL')
SQLALCHEMY_BINDS = {
'db1': os.environ.get('DATABASE_1_URL'),
'db2': os.environ.get('DATABASE_2_URL')}
本例中Cats
table到Dogs
table的外键建立无误:
dogs_id = db.Column(db.Integer, db.ForeignKey('dogs.id'))
但是对 People
table,
people_id = db.Column(db.Integer, db.ForeignKey('people.id'))
当 运行 flask db migrate
:
sqlalchemy.exc.NoReferencedTableError: Foreign key associated with column 'cats.people_id' could not find table 'people' with which to generate a foreign key to target column 'id'
线程,例如this one表示外键应该通过包含架构名称或绑定键来建立:
people_id = db.Column(db.Integer, db.ForeignKey('db1.people.id'))
但是,这会导致相同的错误:
sqlalchemy.exc.NoReferencedTableError: Foreign key associated with column 'cats.people_id' could not find table 'db1.people' with which to generate a foreign key to target column 'id'
如有任何建议,我们将不胜感激!
问题是您不能跨数据库定义外键。如果您可以将所有这些表移动到一个数据库中,也许将它们放在不同的模式中,那么您会没事的。
你应该设置 schema
并用它设置外键。
class People(db.Model):
__bind_key__ = 'db1'
__table_args__ = {'schema': 'db1'}
id = db.Column(db.Integer, primary_key=True)
class Cats(db.Model):
__bind_key__ = 'db2'
__table_args__ = {'schema': 'db2'}
id = db.Column(db.Integer, primary_key=True)
people_id = db.Column(db.Integer, db.ForeignKey('db1.people.id'))
dogs_id = db.Column(db.Integer, db.ForeignKey('db2.dogs.id'))
class Dogs(db.Model):
__bind_key__ = 'db2'
__table_args__ = {'schema': 'db2'}
id = db.Column(db.Integer, primary_key=True)