是否有一个ORM结构可让我拥有产生Catalog.Schema.Table的表?

时间:2019-04-29 20:39:30

标签: python sqlalchemy flask-sqlalchemy alembic flask-migrate

我目前正在使用现有数据库进行项目。服务器是具有多个目录(数据库)的群集服务器,并且在每个目录中都有多个带表的模式。传统SQL查询的表名格式为[Catalog]。[Schema]。[Table]。这种结构适用于传统的SQL。

当我尝试烧瓶数据库迁移到sqlite数据库进行测试时,出现了问题。根据我的尝试,我会遇到许多错误。

我正在使用

  • Python 3.7
  • 烧瓶1.0.2
  • Flask-SQLAlchemy 2.4.0
  • 烧瓶迁移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) )"
  • 绑定架构(绑定设置正确)
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'"

如果执行“仅模式”方法,则可以在数据库上运行查询,但不能正确设置我的test-db。

我花了多个小时试图找到解决方案,并且希望有人帮助我找到前进的方向(如果您找到其他解决方案的链接,请告诉我您搜索过的内容以增加我的Google-fu)

主要问题是:

  • 为这种情况建立模型的正确方法是什么?
  • 在这种情况下文档中是否缺少某些内容?

0 个答案:

没有答案