sqlalchemy + flask: class 未定义
sqlalchemy + flask: class is not defined
我正在使用 sqlalchemy + alembic + Flask,我无法映射循环 类。
apps/users/models.py:
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
email = Column(String)
password = Column(String)
session = relationship("Session", back_populates='user', cascade='all,delete', lazy='dynamic')
notes = relationship('Note2User', back_populates='user', cascade='all,delete', lazy='dynamic')
apps/notes/models.py:
class Note2User(Base):
__tablename__ = 'notes_users_m2m'
id = Column(Integer, primary_key=True)
user_id = Column(Integer, ForeignKey('users.id', ondelete='CASCADE'), nullable=False)
user = relationship('User', back_populates='notes')
note_id = Column(Integer, ForeignKey('notes.id', ondelete='CASCADE'), nullable=False)
note = relationship('Note', back_populates='users')
Table Note2User 为 m2m 关系用户 <-> 注释,但是当我启动应用程序并完成一些请求时,出现错误:
InvalidRequestError: When initializing mapper Mapper|User|users,
expression 'Note2User' failed to locate a name ("name 'Note2User' is
not defined"). If this is a class name, consider adding this
relationship() to the class after
both dependent classes have been defined.
正在 db/init.py 中初始化 db: (dunder name)
from sqlalchemy import create_engine, MetaData
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import Session
engine = create_engine('postgresql+psycopg2://server:12345@localhost:5432/test')
Base = declarative_base()
meta = MetaData()
meta.reflect(bind=engine)
db_session = Session(bind=engine)
在 apps/users/models.py
文件中添加 Note2User
class 的导入,以便在 User
class 中初始化该关系之前首先定义此模型,从而引用它.
像这样
# file: apps/users/models.py
from ..notes.models import Note2User
您需要将 user.models 模块导入 notes.model 模块,反之亦然。它看起来像这样:
# file app/users/models.py
import app.notes.models as notes
# use it like this
notes.Notes2User()
# file app/notes/models.py
import app.users.models as users
users.User()
这样做的好处是,当程序不可避免地增长时,您将避免循环依赖问题。当我使用相同的堆栈创建应用程序时,我遇到了很多循环依赖问题。唯一的解决办法是放弃
from . import Foo
并且只使用
import bar.foo as foo
出于这个原因,使用导入语法被认为是最佳做法。
Reference.
我正在使用 sqlalchemy + alembic + Flask,我无法映射循环 类。
apps/users/models.py:
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
email = Column(String)
password = Column(String)
session = relationship("Session", back_populates='user', cascade='all,delete', lazy='dynamic')
notes = relationship('Note2User', back_populates='user', cascade='all,delete', lazy='dynamic')
apps/notes/models.py:
class Note2User(Base):
__tablename__ = 'notes_users_m2m'
id = Column(Integer, primary_key=True)
user_id = Column(Integer, ForeignKey('users.id', ondelete='CASCADE'), nullable=False)
user = relationship('User', back_populates='notes')
note_id = Column(Integer, ForeignKey('notes.id', ondelete='CASCADE'), nullable=False)
note = relationship('Note', back_populates='users')
Table Note2User 为 m2m 关系用户 <-> 注释,但是当我启动应用程序并完成一些请求时,出现错误:
InvalidRequestError: When initializing mapper Mapper|User|users, expression 'Note2User' failed to locate a name ("name 'Note2User' is not defined"). If this is a class name, consider adding this relationship() to the class after both dependent classes have been defined.
正在 db/init.py 中初始化 db: (dunder name)
from sqlalchemy import create_engine, MetaData
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import Session
engine = create_engine('postgresql+psycopg2://server:12345@localhost:5432/test')
Base = declarative_base()
meta = MetaData()
meta.reflect(bind=engine)
db_session = Session(bind=engine)
在 apps/users/models.py
文件中添加 Note2User
class 的导入,以便在 User
class 中初始化该关系之前首先定义此模型,从而引用它.
像这样
# file: apps/users/models.py
from ..notes.models import Note2User
您需要将 user.models 模块导入 notes.model 模块,反之亦然。它看起来像这样:
# file app/users/models.py
import app.notes.models as notes
# use it like this
notes.Notes2User()
# file app/notes/models.py
import app.users.models as users
users.User()
这样做的好处是,当程序不可避免地增长时,您将避免循环依赖问题。当我使用相同的堆栈创建应用程序时,我遇到了很多循环依赖问题。唯一的解决办法是放弃
from . import Foo
并且只使用
import bar.foo as foo
出于这个原因,使用导入语法被认为是最佳做法。 Reference.