PostgreSQL架构的Alembic迁移问题和无效的一对多关系

dar*_*sky 3 python sqlalchemy flask alembic

我在Postgres中创建了一个数据库和模式.我有我的模型,当我运行python manager.py db migrate使用Flask-Migrate时,我得到下面的错误.但是,该db init命令有效.

sqlalchemy.exc.ProgrammingError: (ProgrammingError) no schema has been selected to create in
Run Code Online (Sandbox Code Playgroud)

现在,当我添加__tablename____table_args__ = {"schema": "name_of_schema"}我的模型,我得到以下两个错误,db init并且db migrate:

sqlalchemy.exc.NoReferencedTableError: Foreign key associated with column 'deploy.instance_id' could not find table 'instance' with which to generate a foreign key to target column 'id'
Run Code Online (Sandbox Code Playgroud)

然而,我的关系看起来还不错.我见过很多例子,他们在没有Flask-Migrate的SQLite上正常工作.

我有三个表如下(删除大多数列):

class Application(db.Model):
    __tablename__ = 'application'
    __table_args__ = {"schema":"v1"}
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(80), unique=False)
    instances = db.relationship('Instance', backref='application', lazy='dynamic')

    def __repr__(self):
        return '<ID %r>' % (self.id)


class Instance(db.Model):
    __tablename__ = 'instance'
    __table_args__ = {"schema":"v1"}
    id = db.Column(db.Integer, primary_key=True)
    host = db.Column(db.String(80), unique=False)
    application_id = db.Column(db.Integer, db.ForeignKey('application.id'))
    deploys = db.relationship('Deploy', backref='instance', lazy='dynamic')

    def __repr__(self):
        return '<ID %r>' % (self.id)


class Deploy(db.Model):
    __tablename__ = 'deploy'
    __table_args__ = {"schema":"v1"}
    id = db.Column(db.Integer, primary_key=True)
    tag = db.Column(db.String(80), unique=False)
    instance_id = db.Column(db.Integer, db.ForeignKey('instance.id'))

    def __repr__(self):
        return '<ID %r>' % (self.id)
Run Code Online (Sandbox Code Playgroud)

关系是:

  • 应用程序实例(一对多;一个应用程序多个实例)
  • 部署实例(一对多;一个实例多部署)

当我删除所有关系并创建一个独立的表时,我仍然得到第一个错误:sqlalchemy.exc.ProgrammingError: (ProgrammingError) no schema has been selected to create in.有什么问题,我该如何解决?

zzz*_*eek 6

Postgresql具有"默认模式"的概念,使用SEARCH_PATH设置.它听起来像您正在连接的用户,因为没有配置.查看Postgresql网站上的Client Connection Defaults.

对于外键错误,当您使用schema带有a 的显式参数时Table,也需要在ForeignKey对象中指定该名称:

ForeignKey('myschema.mytable.id')
Run Code Online (Sandbox Code Playgroud)