【问题标题】:sqlalchemy.exc.NoReferencedTableError: Foreign key associated with column X could not find table Y with which to generate a foreign keysqlalchemy.exc.NoReferencedTableError:与列 X 关联的外键找不到用于生成外键的表 Y
【发布时间】:2018-07-06 11:43:42
【问题描述】:

我的 sqlalchemy 架构中出现以下错误

python manage.py db migrate
...
sqlalchemy.exc.NoReferencedTableError: Foreign key associated with column 
'ArxivPaperFigure.arxiv_id' could not find table 'papers' with which to 
generate a foreign key to target column 'arxiv_id' 

我不明白这个错误,因为表格文件不是新的,而是以前存在的。我做了很多改变,包括给papers表一个新的继承表,但是papers中的主键仍然是相同的arxiv_id。这是我的论文表

class Papers(db.Model, Paper): 

    arxiv_id = db.Column(db.String(1000), primary_key=True)
    ...

指向该表的表是

class ArxivPaperFigure(db.Model): 
    __tablename__ = 'ArxivPaperFigure'

    id = db.Column(db.Integer, primary_key=True)
    arxiv_id = db.Column(db.String(1000), db.ForeignKey('papers.arxiv_id'))

我可以通过重写外键来解决这个问题

arxiv_id = db.Column(db.String(1000), db.ForeignKey(Papers.arxiv_id))

但是,我有很多外键,对于一些也有这些外键的表,这个解决方案不起作用。所以我想了解为什么会出现这个错误?文件表确实存在。如果我使用 psql 并使用 \d 打印所有表,我会找到该行

public | papers  | table    | user

那么为什么这个引用不再起作用了?

【问题讨论】:

    标签: python sql database postgresql sqlalchemy


    【解决方案1】:

    好的,我可以通过显式命名 Papers 表来解决它

    __tablename__ = 'papers'
    

    不知道为什么突然有必要这样做,因为它以前都有效,但修复后一切正常。

    【讨论】:

      【解决方案2】:

      供其他人参考,如果您使用的是模式(例如 Postgres),您可能还必须指定它:

      # Assumes tables live in schema `my_schema`
      
      arxiv_id = db.Column(db.String(1000), db.ForeignKey('my_schema.papers.arxiv_id'))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-08-09
        • 2022-11-11
        • 1970-01-01
        • 2021-04-21
        • 1970-01-01
        • 2011-02-26
        • 1970-01-01
        • 2012-11-24
        相关资源
        最近更新 更多