Flask-Migrate multidb внешний ключ для другой привязки не может найти целевую таблицу - PullRequest
0 голосов
/ 12 июня 2019

Я пытаюсь использовать Flask-Migrate с несколькими базами данных с помощью функции flask-sqlalchemy __binds__. При попытке установить внешний ключ между двумя различными привязками происходит сбой flask db migrate с ошибкой sqlalchemy.exc.NoReferencedTableError, т. Е. Не удается найти таблицу для установки внешнего ключа.

Я использую базы данных Postgres с ключами связывания db1 и db2. Обратите внимание, что эта ошибка не возникает, если внешний ключ находится в таблице с той же привязкой (база данных).

Вот пример приложения, которое демонстрирует проблему:

Приложение / 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)

приложение / 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 для таблицы Dogs устанавливается без ошибок:

dogs_id = db.Column(db.Integer, db.ForeignKey('dogs.id'))

Однако, делая то же самое с таблицей People,

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'

Потоки, такие как , этот указывает, что внешний ключ должен быть установлен путем включения имени схемы или ключа привязки:

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'

Буду признателен за любые предложения по этому вопросу!

Ответы [ 2 ]

0 голосов
/ 20 июня 2019

Вы должны установить 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)
0 голосов
/ 14 июня 2019

Проблема в том, что вы не можете определить внешние ключи для разных баз данных.Если вы можете переместить все эти таблицы в одну базу данных, возможно, поместив их в разные схемы, все будет в порядке.

...