我用的是全栈-fastapi-postgresql,fastapi 0 . 54 . 1版,pydantic版。
我不知道如何设置pydantic,因此它可以在SQLAlchemy中正确地使用多对一双向关系。出于某种原因,我当前的实现会以最大递归错误破坏堆栈。
我知道github的一个讨论,来自_orm()应该在加载SQLAlchemy双向关系时检测循环,而不是吹栈。我相信这是密切相关的,但我不能从中获得任何有用的东西。
任何帮助将不胜感激。
来自 fastAPI 的错误消息:
文件“/usr/local/lib/python 3.7/site-packages/fastapi/encoders . py”,第113行,在JSON able _ encoder sqlalchemy _ safe = sqlalchemy _ safe,文件“/usr/local/lib/python 3.7/site-packages/fastapi/encoders . py”,第166行,在JSON able _ encoder sqlalchemy _ safe = sqlalchemy _ safe,文件“/usr/local/lib/python 3.7/site-packages/fastapi/encoders . py”中
模型:
app/模型/公司. py
from typing import TYPE_CHECKING
from sqlalchemy import Boolean, Column, Integer, String
from sqlalchemy.orm import relationship
from app.db.base_class import Base
if TYPE_CHECKING:
from .company import Company # noqa: F401
class Company(Base):
id = Column(Integer, primary_key=True, index=True)
enabled = Column(Boolean(), default=True)
logourl = Column(String, index=True)
name = Column(String, index=True)
users = relationship("User", back_populates="company")
应用/模型/用户.py
from typing import TYPE_CHECKING
from sqlalchemy import Column, ForeignKey, Integer, String, Boolean, PrimaryKeyConstraint,UniqueConstraint, DateTime
from sqlalchemy.orm import relationship
from app.db.base_class import Base
if TYPE_CHECKING:
from .job import Job # noqa: F401
from .company import Company # noqa: F401
class User(Base):
id = Column(Integer, primary_key=True, index=True)
full_name = Column(String, index=True)
email = Column(String, unique=True, index=True, nullable=False)
hashed_password = Column(String, nullable=False)
is_active = Column(Boolean(), default=True)
is_superuser = Column(Boolean(), default=False)
company_id = Column(Integer, ForeignKey("company.id"))
company = relationship("Company", back_populates="users")
架构:
app/schemas/user.py
from typing import Optional, Any
from pydantic import BaseModel, EmailStr
# Shared properties
class UserBase(BaseModel):
email: Optional[EmailStr] = None
is_active: Optional[bool] = True
is_superuser: bool = False
full_name: Optional[str] = None
company_id: Optional[int] = None
company: Optional[Any] = None
# Properties to receive via API on creation
class UserCreate(UserBase):
email: EmailStr
password: str
company_id: int
# Properties to receive via API on update
class UserUpdate(UserBase):
password: Optional[str] = None
company_id: Optional[int] = None
class UserInDBBase(UserBase):
id: Optional[int] = None
class Config:
orm_mode = True
# Additional properties to return via API
class User(UserInDBBase):
pass
# Additional properties stored in DB
class UserInDB(UserInDBBase):
hashed_password: str
app/schemas/company.py
from typing import Optional, List
from pydantic import BaseModel
from .user import User
# Shared properties
class CompanyBase(BaseModel):
enabled: Optional[bool] = None
logourl: Optional[str] = None
name: Optional[str] = None
users: List[User] = None
# Properties to receive on Company creation
class CompanyCreate(CompanyBase):
name: str
# Properties to receive on Company update
class CompanyUpdate(CompanyBase):
pass
# Properties shared by models stored in DB
class CompanyInDBBase(CompanyBase):
id: int
name: str
class Config:
orm_mode = True
# Properties to return to client
class Company(CompanyInDBBase):
pass
# Properties properties stored in DB
class CompanyInDB(CompanyInDBBase):
pass
您正在尝试让user
架构包含公司
,但也希望公司
架构包含user
,这意味着当您检索特定公司时,例如,其用户将包含同一公司,而该公司将再次包含所有用户,因此存在递归问题。
当检索到用户
或company
时,您需要决定要显示什么数据,当您只想检索特定的
时,检索公司的完整数据可能没有任何用处。
从UserBase
架构中删除公司
应该就足够了。
问题内容: 问题: 我 在* 两个实体 A和B 之间 有 多对多关联 。我将 A实体 设置为其 关系 的 所有者 (inverse = true在b.hbm.xml中A的集合上)。 * 当我 删除一个A实体时 , 联接表中的 相应 记录也会被删除 。 当我 删除一个B实体时 , 联接表中的 相应 记录不会被删除 (完整性违反异常)。 - 让我们考虑一些非常简单的 示例 : 文件 a.hbm.xml
1. 前言 本节课程和大家一起聊聊一对多关联映射。通过本节课程,你将了解到: 如何实现一对多关联映射; 如何实现双向一对多关联映射; 关联映射中的级联操作。 2. 一对多关联映射 关系型数据库中表与表中的数据存在一对多(或多对一)关系。 如学生表、班级表。一个班级有多个学生,多个学生可以在同一个班级。 一对多或多对一本质上是一样的,如同一块硬币的正面和反面,只是看待事物的角度不同而已。 数据库中有
问题内容: 我与共享密钥具有一对一的双向实体关系。当我尝试保存关联的所有者时,对于该关系的拥有方,我收到一个“生成的null ID”异常。我正在使用hibernate- entitymanager并使用spring进行事务管理。 所属实体 所属实体 并且下面的代码用于保存实体: 在休眠3.5.0-最终版中,这一切都可以正常工作。尝试升级到3.5.6-Final或3.6.0.Final时,是我开始获
问题内容: 任何人都可以解释在设计带有示例的表时如何实现一对一,一对多和多对多关系吗? 问题答案: 一对一: 使用外键访问被引用的表: 您还必须在外键列()上设置唯一约束,以防止子表()中的多行与引用表()中的同一行相关。 一对多 :在关系的许多方面使用外键链接回“一个”侧: 多对多 :使用联结表(例如): 查询示例:
问题内容: 我与共享密钥具有一对一的双向实体关系。当我尝试保存关联的所有者时,对于该关系的拥有方,我收到一个“生成的null ID”异常。我正在使用hibernate- entitymanager并使用spring进行事务管理。 所属实体 所属实体 并且以下代码用于保存实体: 在hibernate3.5.0-最终版中,这一切都可以正常工作。尝试升级到3.5.6-Final或3.6.0.Final时
在FastAPI中,我使用了SQLAlchemy和Pydanic返回数据 这种方式可以帮助我规范化返回的模型,但是我想要将所有api统一返回格式为{"code":0,"msg":"success","data":{...}},使原本返回模型中User的模型置于data中,方便前端管理。 我尝试了使用FastAPI中间件来实现,但是在swagger等文档中无法识别返回模型User;如果重新定义一个通