Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在set和create上自动生成sqlalchemy关系?_Python_Sqlalchemy - Fatal编程技术网

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对象
    
    有一些重要的变化使这成为可能

  • 将轨迹外键设置为“私有”,这意味着我们不应该直接设置这些外键。允许ORM在幕后填充这些内容。我发现的唯一例外是
    init
    。由于外键兼作曲目的主键,如果使用
    session.merge()
    ,则在将曲目附加到会话之前不设置外键将产生问题
  • 通过以上步骤,创建以允许通过相册关系访问这些属性
  • 创建sette