2014-08-28 47 views
3

我在Postgres中創建了一個數據庫和模式。我有我的模型,當我運行使用Flask-Migrate的python manager.py db migrate時,出現下面的錯誤。但是,db init命令有效。PostgreSQL模式的Alembic遷移問題和無效的一對多關係

sqlalchemy.exc.ProgrammingError: (ProgrammingError) no schema has been selected to create in 

現在,當我添加__tablename____table_args__ = {"schema": "name_of_schema"}我的模型,我得到以下兩個錯誤,db initdb 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' 

我的關係不過,看行不行。我見過很多例子,他們在沒有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) 

的關係是:

  • 應用實例(一到多;一個應用程序許多情況下)
  • 部署實例(一對多;一個部署多個部署)

當我刪除所有關係並創建一個獨立表,我仍然得到第一個錯誤:sqlalchemy.exc.ProgrammingError: (ProgrammingError) no schema has been selected to create in。有什麼問題,我該如何解決它?

回答

6

Postgresql具有使用SEARCH_PATH設置的「默認模式」的概念。這聽起來像你正在連接的用戶,因爲沒有配置。在Postgresql網站上查看Client Connection Defaults

對於外鍵的錯誤,當你使用一個明確的schema參數以Table,該名稱需要ForeignKey對象以及被指定:

ForeignKey('myschema.mytable.id') 
+0

這就是我失蹤了,沒有指定的模式ForeignKey。謝謝! – darksky 2014-09-02 14:36:10