【问题标题】:Sql alchemy sqlalchemy.exc.NoReferencedTableError not creating tablesSql alchemy sqlalchemy.exc.NoReferencedTableError 未创建表
【发布时间】:2021-09-29 02:36:06
【问题描述】:

我正在使用烧瓶并尝试学习 sqlalchemy,我有一个数据库,我在其中添加了第三个表以创建新功能,但整个项目停止工作,它说:

sqlalchemy.exc.NoReferencedTableError: Foreign key associated with column 'url_reference.folder_rel' could not find table 'reffolders' with which to generate a foreign key to target column 'id'

这是dbs.py

from . import db
from flask_login import UserMixin
from sqlalchemy.sql import func
  
class User(db.Model, UserMixin):
    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(200), unique=True)
    user_password = db.Column(db.String(150))
    user_name = db.Column(db.String(400))
    user_refs = db.relationship("RefFolders")

class RefFolders(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    folder_title = db.Column(db.String(1000))
    date_added = db.Column(db.DateTime(timezone=True), default=func.now())
    user_rel = db.Column(db.Integer, db.ForeignKey("user.id"))
    url_rel = db.relationship("UrlReference")

class UrlReference(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    ref_title = db.Column(db.String(1000))
    ref_url = db.Column(db.String(30000))
    date_added = db.Column(db.DateTime(timezone=True), default=func.now())
    folder_rel = db.Column(db.Integer, db.ForeignKey("reffolders.id"))

这是我在__init__.py中创建数据库的地方:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from os import path
from flask_login import LoginManager

db = SQLAlchemy()
 
DB_NAME = "database.db"
 
def app():
    app = Flask(__name__)
    app.config['SECRET_KEY'] = '<here is the key in my code>'
    app.config['SQLALCHEMY_DATABASE_URI'] = f"sqlite:///{DB_NAME}"
    db.init_app(app)
 
    # making the blueprints usable
  
    from .views import views
    from .auth import auth

    app.register_blueprint(views, url_prefix="/")
    app.register_blueprint(auth, url_prefix="/")
  
    from .dbs import User
    from .dbs import UrlReference
    from .dbs import RefFolders
 
    db_create(app)
 
    # Login manager
  
    login_manager= LoginManager()
    login_manager.login_view = 'views.home'
    login_manager.init_app(app)
  
    # Searching and loading user
  
    @login_manager.user_loader
    def load_user(id):
        return User.query.get(int(id))
   
    return app
 
def db_create(app):
    if not path.exists("project/" + DB_NAME):
        db.create_all(app=app)

我不知道发生了什么,可能是双外键有问题?

【问题讨论】:

    标签: python flask sqlalchemy flask-sqlalchemy


    【解决方案1】:

    我认为flask或其扩展会猜测您想要的表名,例如CamelCase --> camel_case。

    所以在这种情况下,表名可能是ref_folders。您可能只想使用 tablename 自己设置表名,尽管我认为它们的默认值是一个很好的约定。

    作为旁注,我建议您使用 _id 作为您的 id,否则对象关系和实际 id 之间的事情可能会变得非常混乱,即。在RefFolders 中使用user_id 而不是user_rel

    见:

    https://flask-sqlalchemy.palletsprojects.com/en/2.x/models/#declaring-models

    在 SQLAlchemy 中需要的一些部分是可选的 烧瓶-SQLAlchemy。例如,表名自动设置为 你除非被覆盖。它派生自转换为的类名 小写并且将“CamelCase”转换为“camel_case”。覆盖 表名,设置__tablename__类属性。

    【讨论】:

      猜你喜欢
      • 2018-11-24
      • 2016-05-29
      • 2019-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-29
      • 1970-01-01
      相关资源
      最近更新 更多