Я сейчас работаю над проектом с уже существующей базой данных. Сервер представляет собой кластерный сервер с несколькими каталогами (база данных), и в каждом каталоге есть несколько схем с таблицами. Формат имени таблицы для традиционного запроса SQL будет [Каталог]. [Схема]. [Таблица]. Эта структура работает для традиционного SQL.
Проблема возникает, когда я пытаюсь выполнить перенос базы данных в базу данных sqlite для тестирования. Я получаю несколько ошибок в зависимости от того, что я пытаюсь.
Я использую
- Python 3.7
- Колба 1.0.2
- Flask-SQLAlchemy 2.4.0
- Flask-Migrate 2.4.0
- Windows 10 (не идеально, но это то, что у меня есть)
Я пробовал следующее с разными результатами:
class User(db.Model):
__tablename__ = 'user'
__table_args__ = (
db.PrimaryKeyConstraint('userid')
, db.ForeignKeyConstraint(('manageruserid',), ['CatalogA.SchemaA.userid'])
, {'schema': 'CatalogA.SchemaA'}
)
manager_user_id = db.Column('manageruserid', db.Integer())
user_id = db.Column('userid', db.Integer(), nullable=False)
class Tool(db.Model):
__tablename__ = 'tool'
__table_args__ = (
db.PrimaryKeyConstraint('toolid')
, db.ForeignKeyConstraint(('ownerid',), ['CatalogA.SchemaA.user.userid'])
, {'schema': 'CatalogB.SchemaB'}
)
tool_id = db.Column('toolid', db.Integer())
owner_id = db.Column('ownerid', db.Integer(), nullable=False)
при попытке обновления выдает ошибку:
"sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) unknown database "CatalogA.SchemaA" [SQL: CREATE TABLE "CatalogA.SchemaA".user (
manageruserid INTEGER,
userid INTEGER NOT NULL,
PRIMARY KEY (userid),
FOREIGN KEY(manageruserid) REFERENCES user (userid) )"
- Bind With Schema (привязки настроены правильно)
class User(db.Model):
__bind_key__ = 'CatalogA'
__tablename__ = 'user'
__table_args__ = (
db.PrimaryKeyConstraint('userid')
, db.ForeignKeyConstraint(('manageruserid',), ['CatalogA.SchemaA.user.userid'])
, {'schema': 'SchemaA'}
)
manager_user_id = db.Column('manageruserid', db.Integer())
user_id = db.Column('userid', db.Integer(), nullable=False)
class Tool(db.Model):
__bind_key__ = 'CatalogB'
__tablename__ = 'tool'
__table_args__ = (
db.PrimaryKeyConstraint('toolid')
, db.ForeignKeyConstraint(('ownerid',), ['CatalogA.SchemaA.user.userid'])
, {'schema': 'SchemaB'}
)
tool_id = db.Column('toolid', db.Integer())
owner_id = db.Column('ownerid', db.Integer(), nullable=False)
при попытке миграции выдает ошибку:
"sqlalchemy.exc.NoReferencedTableError: Foreign key associated with column 'user.manageruserid' could not find table 'CatalogA.SchemaA.user' with which to generate a foreign key to target column 'userid'"
Если я делаю это только методом Schema, тогда я могу запускать запросы к базе данных, но это неправильно настраивает мою test-db.
Я искал несколько часов, пытаясь найти решение, и хотел бы, чтобы кто-нибудь помог мне найти путь вперед (если вы найдете ссылку на другое решение, пожалуйста, скажите мне, что вы искали, чтобы увеличить мою google-fu) .
Основные вопросы:
- Как правильно подобрать модель для этой ситуации?
- Было / есть что-то в документации, что я пропустил для этого сценария?