python - 使用外键时 SQLAlchemy 中的映射错误
问题描述
我有两个 SQLAlchemy 模型,其中一个由主键引用。
这是我的父模型:
try:
from sqlalchemy import Column, Integer, Enum, DateTime, String, ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import scoped_session, sessionmaker, relationship
from sqlalchemy.orm import validates, backref
import datetime
from lib.dbConnector import Session
from werkzeug.security import generate_password_hash
except ImportError as err:
raise err
Base = declarative_base()
class users_table(Base):
__tablename__ = 'users_table'
userid = Column(String(50), unique= True, primary_key= True, nullable= False)
username = Column(String(500), unique= True, nullable= False)
password = Column(String(500), nullable= False)
email = Column(String(500), nullable= False, unique= True)
role = Column(String(10), default= 'user', nullable= False)
created_on = Column(DateTime, nullable= False, default= datetime.datetime.utcnow)
updated_on = Column(DateTime, nullable= False, default= datetime.datetime.utcnow)
这是我的子表:
try:
from sqlalchemy import Column, Integer, Enum, DateTime, String, ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import scoped_session, sessionmaker, relationship
from sqlalchemy.orm import validates
import datetime
from lib.dbConnector import Session
except ImportError as err:
raise err
Base = declarative_base()
class user_status_table(Base):
__tablename__ = 'user_status_table'
id = Column(Integer, primary_key= True, nullable= False, unique= True, autoincrement=True)
userid = Column(String(50), ForeignKey('models.usersModel.users_table.userid'), nullable= False, unique= True)
status = Column(String(50), default= 'active', nullable= False)
updated_on = Column(DateTime, nullable= False, default= datetime.datetime.utcnow)
userid = relationship('models.usersModel.users_table.users_table', foreign_keys=userid)
在运行我的服务器时,我收到以下错误
"One or more mappers failed to initialize - can't proceed with initialization of other mappers. Triggering mapper: 'Mapper|user_status_table|user_status_table'. Original exception was: mapper"
谁能建议我在这里做错了什么?这就是我提交交易的地方
userdata = usersModel.users_table(userid, username, password, email, role)
try:
self.session.add(userdata)
self.session.flush()
userstatusdata = userstatusModel.user_status_table(userdata.userid, 'active')
self.session.add(userstatusdata)
self.session.commit()
except:
self.session.rollback()
raise
解决方案
在我们回答你的问题之前,有几点说明:
- 不要在导入时执行 try/except ,然后在 except 子句中提出。它只会使您的回溯更加复杂
- 您的导入以及表定义包含许多对您的问题无关紧要的代码。不要那样做。
我用代码创建了两个文件,清理后删除了我确定不需要的东西。usermodel.py 包含以下内容:
from sqlalchemy import Column, Integer, Enum, DateTime, String, ForeignKey
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class users_table(Base):
__tablename__ = 'users_table'
userid = Column(String(50), unique= True, primary_key= True, nullable= False)
username = Column(String(500), unique= True, nullable= False)
userstatus.py 包含:
from usermodel import Base, users_table
from sqlalchemy import Column, Integer, Enum, DateTime, String, ForeignKey
from sqlalchemy.orm import relationship
class user_status_table(Base):
__tablename__ = 'user_status_table'
id = Column(Integer, primary_key= True, nullable= False, unique= True, autoincrement=True)
userid = Column(String(50), ForeignKey('users_table.userid'), nullable= False, unique= True)
user = relationship('users_table')
突出显示的一些更改:
- 我删除了第二个
Base
变量的创建,并在 userstatus.py 中导入了变量,所以两个表都在同一个模式中。我认为您不需要导入用户模型,但我没有检查 - SQLAlchemy 从
__tablename__
属性中识别表。这不能以类名作为前缀。
让我们测试一下:
Python 3.6.5 (default, Mar 31 2018, 19:45:04) [GCC] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import usermodel
>>> import userstatus
>>> usr1 = usermodel.users_table(userid='You', username='Zacharia')
>>> stat1 = userstatus.user_status_table(id=1, user=usr1)
>>> stat1.user
<usermodel.users_table object at 0x7fa2ddbabfd0>
>>> stat1.user.userid
'You'
推荐阅读
- javascript - 可能的未处理承诺拒绝:找不到变量 ErrorTitle
- c# - 如何将 PCM 转换为 MP3?
- c++ - 任何类成员函数类型
- python - 遍历 QTableWidget 中的项目
- python - 使用 Python 解析具有多个 json 的文本文件
- r - 如果在 R data.table 中满足条件,则获取唯一条目
- android - 如何在没有 root [su] 访问权限的情况下读取保存的 wifi 密码
- android - 如何在android上更改语言环境
- c# - 将灰度软拷贝呈现状态与 fo-dicom 结合使用
- m2doc - M2DOC如何定义一个变量并使用它