簡體   English   中英

flask-sqlachemy 外鍵不適用於模型

[英]flask-sqlachemy foreign keys not working with models

我的 flask 應用程序用戶和員工中有兩個模型。

用戶 class:


    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

員工 class:


    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() function 返回 flask 應用程序

我收到以下錯誤

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 上提供的解決方案

Flask中的一對一關系

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

但仍然無法解決此錯誤。

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) 

這篇 SO 帖子提供了更多詳細信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM