簡體   English   中英

在外鍵約束中引用的燒瓶SQLAlchemy列“ id”不存在

[英]Flask SQLAlchemy column “id” referenced in foreign key constraint does not exist

最小示例:

models.py

from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
class Patient(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    notes = db.relationship("Note", backref=db.backref("patient", lazy=True))

class Note(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    patient_id = db.Column(db.Integer, db.ForeignKey("patient.id"), nullable=False)

app.py

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)

app.secret_key = "super secret"

POSTGRES = {
    "user": "postgres",
    "pw": "password",
    "db": "test_db",
    "host": "localhost",
    "port": "5432",
}
app.config["SQLALCHEMY_DATABASE_URI"] = "postgresql://%(user)s:%(pw)s@%(host)s:%(port)s/%(db)s" % POSTGRES
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
app.config["DEBUG"] = True

from models import db
with app.app_context():
    db.init_app(app)

運行

from app import app, db

if __name__ == "__main__":
    with app.app_context():
        db.create_all()
    app.run()

但是,出現以下錯誤:

sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) column "id" referenced in foreign key constraint does not exist
 [SQL: '\nCREATE TABLE note (\n\tid SERIAL NOT NULL, \n\tpatient_id INTEGER NOT NULL, \n\tPRIMARY KEY (id), \n\tFOREIGN KEY(patient_id) REFERENCES patient (id)\n)\n\n'] (Background on this error at: http://sqlalche.me/e/f405)

當我在psql控制台中使用外鍵定義表時,它似乎起作用。 怎么了

我嘗試了您的示例代碼(我必須將應用程序初始化添加到app.py中,以便您的代碼可以按原樣運行)。 它按預期方式工作,並且創建了notepatient表格。

這告訴我您的問題是環境問題。 我願意打賭,如果您在Postgres實例中創建了一個全新的測試數據庫並運行了示例代碼,那么它也將為您服務。

因此,讓我們專注於您要連接的數據庫的狀態。

您收到的ProgrammingError異常顯示了來自Postgres本身的錯誤。 就是說它無法創建notes表,因為沒有諸如patient.id這樣的外鍵。 這可能會讓您失望,因為您知道自己在models.py 定義了patient.id鍵。 不幸的是,我沒有足夠的信息來提供確切的答案,但是我的猜測是:

Postgres中的patient表可能已經從先前的運行中創建,但是具有不同的模式(例如,它最初是在沒有id列的情況下定義的)。 create_all()函數將創建目標數據庫中不存在的表,但不會使用已修改的架構來更新現有表。

去檢查您的Postgres DB並查看patient表。 它實際上是否具有正確定義為主鍵的id列?

如果這些表中沒有您需要的數據,請嘗試刪除它們並再次運行您的應用程序。 我的猜測是它將正確創建兩個表,並且不會引發任何錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM