Есть ли структура ORM, которая позволяет мне иметь таблицы, которые приводят к Catalog.Schema.Table? - PullRequest
1 голос
/ 29 апреля 2019

Я сейчас работаю над проектом с уже существующей базой данных. Сервер представляет собой кластерный сервер с несколькими каталогами (база данных), и в каждом каталоге есть несколько схем с таблицами. Формат имени таблицы для традиционного запроса 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) .

Основные вопросы:

  • Как правильно подобрать модель для этой ситуации?
  • Было / есть что-то в документации, что я пропустил для этого сценария?
...