Python 如何在set和create上自动生成sqlalchemy关系?
我真的不知道这个问题的标题是什么,但希望我能解释一下我想做什么 我在曲目和专辑之间有以下多对一关系:Python 如何在set和create上自动生成sqlalchemy关系?,python,sqlalchemy,Python,Sqlalchemy,我真的不知道这个问题的标题是什么,但希望我能解释一下我想做什么 我在曲目和专辑之间有以下多对一关系: 类相册(基本): __tablename_u=“相册” 艺术家=列(字符串,可空=假,主键=真) 标题=列(字符串,可空=False,主键=True) 年份=列(整数,可空=假,主键=真) 轨迹=关系( “Track”,back\u populates=“\u album\u obj”,cascade=“全部,删除孤儿” ) 班轨(基地): __tablename_=“轨道” #曲目数量+唱片集
类相册(基本):
__tablename_u=“相册”
艺术家=列(字符串,可空=假,主键=真)
标题=列(字符串,可空=False,主键=True)
年份=列(整数,可空=假,主键=真)
轨迹=关系(
“Track”,back\u populates=“\u album\u obj”,cascade=“全部,删除孤儿”
)
班轨(基地):
__tablename_=“轨道”
#曲目数量+唱片集=唯一曲目
track_num=Column(整数,可空=False,主键=True,自动递增=False)
AlbumArtister=列(字符串,可空=False,主键=True)
相册=列(字符串,可空=False,主键=True)
年份=列(整数,可空=假,主键=真,自动递增=假)
艺术家=列(字符串,可空=假,默认为“”)
title=Column(字符串,可空=False,默认为“”)
_album_obj=关系(“album”,back_populates=“曲目”)
__表参数=(
外来约束(
[专辑艺术家,专辑,年份],
[Album.artist,Album.title,Album.year],
),
)
我追求的几个行为:
- 如果我只在曲目的
中添加一个\uuuuu init\uuuu
,这一部分实际上很简单self.\u album\u obj=album(…)
- 这一部分我不太确定如何最好地实现。也许是某种杠杆作用?或者使用关系或外键的某些(我不知道)功能?或者这是一个数据库设计问题,如果我重构我的模型就可以实现吗
track=track(track_num=1,albumartist=“K.Dot”,album=“GKMC”,年份=2012)
断言track.\u album\u obj.title==track.album
相册1=曲目
track.album=“TPAB”
断言track.\u album\u obj.title==track.album
断言相册1不是曲目。\u相册\u对象
以下是完整的工作脚本:
导入sqlalchemy
从sqlalchemy导入列,整数,字符串
从sqlalchemy.ext.declarative导入声明性基础
从sqlalchemy.ext.hybrid导入hybrid_属性
从sqlalchemy.orm导入关系,sessionmaker
从sqlalchemy.schema导入ForeignKeyConstraint
Session=sessionmaker()
Base=声明性_Base()
班级相册(基本):
__tablename_u=“相册”
艺术家=列(字符串,可空=假,主键=真)
标题=列(字符串,可空=False,主键=True)
年份=列(整数,可空=假,主键=真)
轨迹=关系(
“Track”,back\u populates=“\u album\u obj”,cascade=“全部,删除孤儿”
)
定义初始(self,艺术家:str,标题:str,年份:int):
self.artist=艺术家
self.title=标题
self.year=年
班级跑道(基地):#noqa:WPS230
__tablename_=“轨道”
#曲目数量+唱片集=唯一曲目
track_num=Column(整数,可空=False,主键=True,自动递增=False)
_AlbumArtister=列(字符串,可空=False,主键=True)
_相册=列(字符串,可空=False,主键=True)
_年份=列(整数,可空=假,主键=真,自动递增=假)
艺术家=列(字符串,可空=假,默认为“”)
title=Column(字符串,可空=False,默认为“”)
_album_obj=关系(“album”,back_populates=“曲目”)
__表参数=(
外来约束(
[_albumartist,_album,_year],#类型:忽略
[Album.artist,Album.title,Album.year],
),
)
@杂化性
def相册(自我)->str:
返回自我。\u相册\u对象标题
@相册设置器
def相册(自我,新相册标题:str):
self.\u相册\u obj=相册(
艺人=self.albumartist,title=new\u album\u title,year=self.year
)
@杂化性
def唱片艺术家(自我)->str:
回归自我。_专辑_对象艺术家
@塞特唱片公司
def albumartist(自我,新专辑艺术家:str):
self.\u相册\u obj=相册(
艺术家=新专辑艺术家,标题=self.album,年份=self.year
)
@杂化性
def年份(自我)->int:
回归自我。_专辑_对象年
@年份设定器
定义年份(自我,新专辑年:str):
self.\u相册\u obj=相册(
艺术家=self.album艺术家,标题=self.album,年份=新专辑\u年份
)
定义初始(self,唱片集:str,唱片艺术家:str,曲目编号:int,年份:int):
self.\u album\u obj=专辑(艺术家=专辑艺术家,标题=专辑,年份=年份)
self.track\u num=track\u num
self.\u相册=相册
self.\u相册艺术家=相册艺术家
自年=年
engine=sqlalchemy.create_引擎(“sqlite://:memory:”,echo=True)
配置(绑定=引擎)
Base.metadata.create_all(引擎)
会话=会话()
音轨=音轨(音轨数量=1,albumartist=“K.Dot”,album=“GKMC”,年份=2012)
断言track.\u album\u obj.title==track.album
相册1=曲目
track.album=“TPAB”
断言track.\u album\u obj.title==track.album
断言相册1不是曲目。\u相册\u对象
有一些重要的变化使这成为可能
init
。由于外键兼作曲目的主键,如果使用session.merge()
,则在将曲目附加到会话之前不设置外键将产生问题