首页 > 编程问答 >SQLAlchemy 无法通过多对多关系中的外键找到引用的表

SQLAlchemy 无法通过多对多关系中的外键找到引用的表

时间:2024-07-25 11:46:44浏览次数:7  
标签:python sqlalchemy foreign-keys many-to-many flask-sqlalchemy

我已经成功在我的数据库中添加了一个多对多关系。但是,当尝试添加另一个时,我遇到了:

sqlalchemy.exc.NoReferencedTableError: Foreign key associated with column 'user_shiftTemplate.template_id' could not find table 'shifttemplate' with which to generate a foreign key to target column 'id'

我在我试图与之创建关系的两个表之前定义了关联表:

user_shiftTemplate = db.Table('user_shiftTemplate',
db.Column('user_id', db.Integer, db.ForeignKey('user.id')),
db.Column('template_id', db.Integer, db.ForeignKey('shifttemplate.id'))
)

这是我正在尝试创建的实际两个表的关系(同样,在上面显示的关联表之后定义)

class User(db.Model, UserMixin):
    id = db.Column(db.Integer, primary_key=True)
    oauth_id = db.Column(db.String(512), nullable=False, unique=True, default='')
    ext_id = db.Column(db.Integer, nullable=False, unique=True)
    name = db.Column(db.String(300), nullable=False)
    email = db.Column(db.String(256), unique=True, nullable=False)
    phone = db.Column(db.Integer, nullable=False)
    date_joined = db.Column(db.DateTime, nullable=False, default=getPacificTime)
    password = db.Column(db.String(60), nullable=False)
    meta = db.Column(db.JSON, nullable=False, default={})

    shifts = db.relationship('Shift', secondary=user_shift, backref='employees') 
    #^^^^ This is the other many-to-many relationship which actually works ^^^^
    shiftTemplates = db.relationship('ShiftTemplate', secondary=user_shiftTemplate, backref='employees')

class ShiftTemplate(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(128), nullable=False)
    duration = db.Column(db.Integer, nullable=False)
    maxEmployees = db.Column(db.Integer, nullable=False)
    minEmployees = db.Column(db.Integer, nullable=False)
    startTime = db.Column(db.String(4), nullable=False)

我已仔细确保 ShiftTemplate 表的格式与我已成功创建的其他多对多关系表的格式相匹配。但是,由于某种原因,某些原因导致 SQLAlchemy 无法识别我的 ShiftTemplate 表。还应该注意的是,在关联表定义的 db.ForeignKey('shifttemplate.id') 行中,我尝试了每种大写组合,从 shiftTemplate 到 ShiftTemplate 到 Shifttemplate,它们都返回相同的错误,所以我怀疑是原因。


错误信息表明 SQLAlchemy 在创建 user_shiftTemplate 表的外键时找不到名为 shifttemplate 的表。 这可能是因为以下几个原因:

  1. 表名大小写 : 确保数据库中的表名与你在代码中使用的表名的大小写完全匹配。 在错误信息中,表名是 shifttemplate ,而在你的代码中,你使用了 ShiftTemplate 。 数据库系统(如 PostgreSQL)默认情况下区分大小写。

  2. 解决方法: 将 shifttemplate 改为 ShiftTemplate 或者在创建表时指定正确的表名: python user_shiftTemplate = db.Table('user_shiftTemplate', db.Column('user_id', db.Integer, db.ForeignKey('user.id')), db.Column('template_id', db.Integer, db.ForeignKey('ShiftTemplate.id')) )

  3. 表创建顺序 : 确保 ShiftTemplate 表在 user_shiftTemplate 表之前创建。 SQLAlchemy 需要先找到 ShiftTemplate 表才能创建指向它的外键。

  4. 解决方法: 在创建 user_shiftTemplate 表之前,先创建 ShiftTemplate 表: ```python class ShiftTemplate(db.Model): # ...

    user_shiftTemplate = db.Table('user_shiftTemplate', # ... ) ```

  5. 数据库反射 : 如果你使用的是数据库反射来创建模型,请确保 ShiftTemplate 表已包含在反射过程中。

  6. 解决方法:

    • 检查 Base.metadata.reflect() 调用是否包含 ShiftTemplate 表。
    • 如果你正在使用 automap ,请确保 ShiftTemplate 表包含在自动映射中。
  7. 数据库连接 : 确保你的 SQLAlchemy 引擎连接到正确的数据库。 如果你有多个数据库,请检查你是否连接到包含 ShiftTemplate 表的数据库。

请尝试以上解决方案,并确保你的代码与数据库状态一致。

标签:python,sqlalchemy,foreign-keys,many-to-many,flask-sqlalchemy
From: 75195574

相关文章