Внешний ключ sqlalchemy не может найти таблицу

Я создаю базу данных, используя sqlalchemy, которая состоит из трех классов: User, Meeting, MeetingRoom. Я хочу создать внешний ключ в собрании для комнаты собраний, но по какой-то причине выдает следующую ошибку

sqlalchemy.exc.NoReferencedTableError: Foreign key associated with column 'meeting.mrid' could not find table 'meetingroom' with which to generate a foreign key to target column 'mrid'

Внешний ключ sqlalchemy не может найти таблицу

Когда мы делаем это наоборот (добавляем внешний ключ собрания в конференц-зал), это работает, я не уверен, в чем проблема. Это код:

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 не будет «создавать» таблицы, просто запустив этот код.

Richard 23.06.2019 10:14

я запустил sqlite3 и создал базу данных, затем, когда я возвращаюсь к python и набираю db.create_all(), появляется эта ошибка, я пробовал ее раньше с разными внешними ключами (от комнаты для собраний до встречи), и это работало без ошибок @Richard

monmon 23.06.2019 10:20
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
2
2 545
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

SqlAlchemy создает таблицы со своей собственной схемой имен таблиц и использует meeting_room. Таким образом, вы ссылаетесь на это имя в relationship или можете переопределить, установив свойство __tablename__ в классе модели. Так:

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

Другие вопросы по теме