【问题标题】:flask-sqlachemy foreign keys not working with modelsflask-sqlalchemy 外键不适用于模型
【发布时间】:2020-09-23 03:35:48
【问题描述】:

我的烧瓶应用程序用户和员工中有两个模型。

用户类别:


    from flask_login import UserMixin
    from . import db


    class User(UserMixin, db.Model):
        id = db.Column(db.Integer, primary_key=True)  # primary keys are required in SQLAlchemy
        email = db.Column(db.String(100), unique=True)
        password = db.Column(db.String(100), nullable=False)
        name = db.Column(db.String(1000), nullable=False)
        user_type = db.Column(db.Enum("Candidate", "Employee", name="user_type"))

        def get_id(self):
            return self.id

员工等级:


    from . import db
    from .model_user import User


    class Employee(db.Model):
        employee_id = db.Column(db.Integer, primary_key=True)
        employee_title = db.Column(db.String(100), nullable=False)
        employee_permissions = db.Column(db.String(10000), nullable=True)
        user_id = Column('user_id', Integer, ForeignKey("user.id"))
        user = relationship("User", backref=backref("user", uselist=False))

        def get_id(self):
            return self.employee_id

我尝试过使用

db.create_all(app=create_app())

其中 db = SQLAlchemy() 和 create_app() 函数返回烧瓶应用程序

我收到以下错误

Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "C:\Users\krish\AppData\Local\Programs\Python\Python38\lib\site-packages\sqlalchemy\sql\schema.py", line 926, in create
    bind._run_visitor(ddl.SchemaGenerator, self, checkfirst=checkfirst)
  File "C:\Users\krish\AppData\Local\Programs\Python\Python38\lib\site-packages\sqlalchemy\engine\base.py", line 2104, in _run_visitor
    conn._run_visitor(visitorcallable, element, **kwargs)
  File "C:\Users\krish\AppData\Local\Programs\Python\Python38\lib\site-packages\sqlalchemy\engine\base.py", line 1663, in _run_visitor
    visitorcallable(self.dialect, self, **kwargs).traverse_single(element)
  File "C:\Users\krish\AppData\Local\Programs\Python\Python38\lib\site-packages\sqlalchemy\sql\visitors.py", line 144, in traverse_single
    return meth(obj, **kw)
  File "C:\Users\krish\AppData\Local\Programs\Python\Python38\lib\site-packages\sqlalchemy\sql\ddl.py", line 827, in visit_table
    self.connection.execute(
  File "C:\Users\krish\AppData\Local\Programs\Python\Python38\lib\site-packages\sqlalchemy\engine\base.py", line 1020, in execute
    return meth(self, multiparams, params)
  File "C:\Users\krish\AppData\Local\Programs\Python\Python38\lib\site-packages\sqlalchemy\sql\ddl.py", line 72, in _execute_on_connection
    return connection._execute_ddl(self, multiparams, params)
  File "C:\Users\krish\AppData\Local\Programs\Python\Python38\lib\site-packages\sqlalchemy\engine\base.py", line 1071, in _execute_ddl
    compiled = ddl.compile(
  File "<string>", line 1, in <lambda>
  File "C:\Users\krish\AppData\Local\Programs\Python\Python38\lib\site-packages\sqlalchemy\sql\elements.py", line 476, in compile
    return self._compiler(dialect, bind=bind, **kw)
  File "C:\Users\krish\AppData\Local\Programs\Python\Python38\lib\site-packages\sqlalchemy\sql\ddl.py", line 29, in _compiler
    return dialect.ddl_compiler(dialect, self, **kw)
  File "C:\Users\krish\AppData\Local\Programs\Python\Python38\lib\site-packages\sqlalchemy\sql\compiler.py", line 319, in __init__
    self.string = self.process(self.statement, **compile_kwargs)
  File "C:\Users\krish\AppData\Local\Programs\Python\Python38\lib\site-packages\sqlalchemy\sql\compiler.py", line 350, in process
    return obj._compiler_dispatch(self, **kwargs)
  File "C:\Users\krish\AppData\Local\Programs\Python\Python38\lib\site-packages\sqlalchemy\sql\visitors.py", line 95, in _compiler_dispatch
    return meth(self, **kw)
  File "C:\Users\krish\AppData\Local\Programs\Python\Python38\lib\site-packages\sqlalchemy\sql\compiler.py", line 2914, in visit_create_table
    const = self.create_table_constraints(
  File "C:\Users\krish\AppData\Local\Programs\Python\Python38\lib\site-packages\sqlalchemy\sql\compiler.py", line 2963, in create_table_constraints
    return ", \n\t".join(
  File "C:\Users\krish\AppData\Local\Programs\Python\Python38\lib\site-packages\sqlalchemy\sql\compiler.py", line 2963, in <genexpr>
    return ", \n\t".join(
  File "C:\Users\krish\AppData\Local\Programs\Python\Python38\lib\site-packages\sqlalchemy\sql\compiler.py", line 2966, in <genexpr>
    self.process(constraint)
  File "C:\Users\krish\AppData\Local\Programs\Python\Python38\lib\site-packages\sqlalchemy\sql\compiler.py", line 350, in process
    return obj._compiler_dispatch(self, **kwargs)
  File "C:\Users\krish\AppData\Local\Programs\Python\Python38\lib\site-packages\sqlalchemy\sql\visitors.py", line 95, in _compiler_dispatch
    return meth(self, **kw)
  File "C:\Users\krish\AppData\Local\Programs\Python\Python38\lib\site-packages\sqlalchemy\sql\compiler.py", line 3214, in visit_foreign_key_constraint
    remote_table = list(constraint.elements)[0].column.table
  File "C:\Users\krish\AppData\Local\Programs\Python\Python38\lib\site-packages\sqlalchemy\util\langhelpers.py", line 883, in __get__
    obj.__dict__[self.__name__] = result = self.fget(obj)
  File "C:\Users\krish\AppData\Local\Programs\Python\Python38\lib\site-packages\sqlalchemy\sql\schema.py", line 2125, in column
    raise exc.NoReferencedTableError(
sqlalchemy.exc.NoReferencedTableError: Foreign key associated with column 'employee.user_id' could not find table 'User' with which to generate a foreign key to target column 'id'

我显然有用户表和 id 列。我什至尝试过在数据库中手动创建用户表,但我仍然遇到同样的错误。不知道我哪里出错了。我也尝试过 SO 上提供的解决方案

One-to-one relationship in Flask

https://docs.sqlalchemy.org/en/13/orm/basic_relationships.html#one-to-one

但仍然无法解决此错误。

【问题讨论】:

  • 你这里有ForeignKey("user.id"),但错误看起来你真的有ForeignKey("User.id")
  • @IljaEverilä 我已经尝试过 User.id 和 user.id... 仍然遇到同样的错误

标签: python flask sqlalchemy foreign-keys flask-sqlalchemy


【解决方案1】:

Flask 找不到表,因为你没有定义表名。

例子:

class Employee(db.Model):
    __tablename__ = 'employees'  # <-- whatever table name you want 
    employee_id = db.Column(db.Integer, primary_key=True)

class User(UserMixin, db.Model):
    __tablename__ = 'user'
    id = db.Column(db.Integer, primary_key=True) 

This SO post 提供更多详细信息。

【讨论】:

  • 我有一个错字。将我的答案从“_tablename_ = 'users'”更改为“_tablename_ = 'user'”
  • 单引号和双引号我都试过了。我仍然遇到同样的错误
  • 我的错字是用户中的“s”。单引号和双引号应该没有区别。
  • Flask-SQLAlchemy Model 根据类名中的TableName 自动定义table_name
猜你喜欢
  • 2021-03-09
  • 2015-07-29
  • 2023-03-17
  • 1970-01-01
  • 2015-08-27
  • 2017-05-24
  • 2017-08-28
  • 1970-01-01
  • 2015-04-07
相关资源
最近更新 更多