【问题标题】:sqlalchemy foreign key could not find tablesqlalchemy 外键找不到表
【发布时间】:2019-11-05 09:36:07
【问题描述】:

我正在使用 sqlalchemy 创建一个数据库,它由三个类组成,用户、会议、会议室 我想在 Meeting 中为会议室创建一个外键,但由于某种原因,它给出了以下错误

sqlalchemy.exc.NoReferencedTableError: 与列 'meeting.mrid' 关联的外键找不到表 'meetingroom' 用于生成目标列 'mrid' 的外键

当我们反过来(在会议室中添加会议外键)时,它可以工作,我不确定问题出在哪里 这是代码:

from flask import Flask, request, jsonify
from flask_sqlalchemy import SQLAlchemy
from flask_marshmallow import Marshmallow
import os
# ==================================
app = Flask(__name__)
basedir = os.path.abspath(os.path.dirname(__file__))
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///db.db'
app.config['SQLALCHEMY_TRACK_MODIFICATION'] = False
db = SQLAlchemy(app)
ma = Marshmallow(app)
# ====================DATABASE
# =============USER
class User (db.Model):
 id = db.Column(db.Integer,primary_key=True)
 name = db.Column(db.String(30))
 Email = db.Column(db.String(30))
 Pass = db.Column(db.String(30))
 Phone = db.Column(db.String(12))
 Department = db.Column(db.String(30))
 Major = db.Column(db.String(30))
 meeting = db.relationship('Meeting', backref='creator')
 meetingroom = db.relationship('MeetingRoom', backref='reserver')

 def __init__(self, name, Email, Pass, Phone, Department, Major):
  self.name = name
  self.Email = Email
  self.Pass = Pass
  self.Phone = Phone
  self.Department = Department
  self.Major = Major


# ================== MEETING ROOM
class MeetingRoom (db.Model):
 mrid = db.Column(db.Integer,primary_key=True)
 reserver_id = db.Column(db.Integer, db.ForeignKey('user.id'))
 meetingm = db.relationship('Meeting', backref='mrid')
 #mid = db.Column(db.Integer, db.ForeignKey('meeting.Mid'))

 def __init__(self, mrid, reserver_id):
  self.mrid = mrid
  self.reserver_id = reserver_id


# =======================MEETING
class Meeting (db.Model):
 Mid = db.Column(db.Integer,primary_key=True)
 Mname = db.Column(db.String(100))
 Des = db.Column(db.String(100))
 Date = db.Column(db.String(20))
 creator_id = db.Column(db.Integer, db.ForeignKey('user.id'))
 #meetingroomm = db.relationship('MeetingRoom', backref='mroom')
 mrid = db.Column(db.Integer, db.ForeignKey('meetingroom.mrid'))
 #roomno_id = db.Column(db.Integer, db.ForeignKey('meetingroom.mrid')

 def __init__(self, Mname, Des, Date, creator_id, mrid):
  self.Mname = Mname
  self.Des = Des
  self.Date = Date
  self.creator_id = creator_id
  self.mrid = mrid

【问题讨论】:

  • 数据库中是否存在表? sqlalchemy 不会仅通过运行此代码来“创建”表。
  • 我运行 sqlite3 并创建了一个数据库,然后当我返回 python 并键入 db.create_all() 时出现此错误,我之前尝试过使用不同的外键(从会议室到会议)它工作没有任何错误@Richard

标签: python database sqlite sqlalchemy flask-sqlalchemy


【解决方案1】:

SqlAlchemy 正在使用自己的表名方案创建表并使用meeting_room。因此,您可以在 relationship 中引用此名称,或者您可以通过在模型类上设置 __tablename__ 属性来覆盖。像这样:

class MeetingRoom (db.Model):
    __tablename__ = 'meetingroom'

【讨论】:

    猜你喜欢
    • 2020-11-01
    • 1970-01-01
    • 2015-03-18
    • 1970-01-01
    • 1970-01-01
    • 2011-11-25
    • 2019-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多