SQLAlchemy如何创建没有物品的一对一关系?

2024-07-04 09:06:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试在SQLAlchemy中创建一个对象,该对象可以与许多项有关系,但不必如此。这是我的模型文件:

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship
from sqlalchemy import Column, String, Integer, ForeignKey

Base = declarative_base()

class Media(Base):

    __tablename__ = "media"
    id = Column(Integer, primary_key=True, unique=True, autoincrement=True)
    video_id = Column(String)
    audio = relationship("audio", back_populates="media")

class Audio(Base):

    __tablename__ = "audio"
    id = Column(Integer, primary_key=True, unique=True, autoincrement=True)
    media_id = Column(Integer, ForeignKey("media.id"))
    media = relationship("Media", back_populates="audio")

这将创建从媒体到音频的一对多关系。但是,当我尝试使用[]None作为参数来创建媒体项时,它会出错。以下是我正在做的:

new_media_item = Media(
    video_id = some_video_id,
    audio = None # i've also tried [] or just not specifying audio
)

但我得到了这个错误:

Traceback (most recent call last):
  --- some cli code, snipped ---
  File "cool_program.py", line 30, in do_add_media
    audio = None
  File "<string>", line 2, in __init__
  File "/home/spazzlo/.local/lib/python3.6/site-packages/sqlalchemy/orm/instrumentation.py", line 376, in _new_state_if_none
    state = self._state_constructor(instance, self)
  File "/home/spazzlo/.local/lib/python3.6/site-packages/sqlalchemy/util/langhelpers.py", line 855, in __get__
    obj.__dict__[self.__name__] = result = self.fget(obj)
  File "/home/spazzlo/.local/lib/python3.6/site-packages/sqlalchemy/orm/instrumentation.py", line 202, in _state_constructor
    self.dispatch.first_init(self, self.class_)
  File "/home/spazzlo/.local/lib/python3.6/site-packages/sqlalchemy/event/attr.py", line 322, in __call__
    fn(*args, **kw)
  File "/home/spazzlo/.local/lib/python3.6/site-packages/sqlalchemy/orm/mapper.py", line 3361, in _event_on_first_init
    configure_mappers()
  File "/home/spazzlo/.local/lib/python3.6/site-packages/sqlalchemy/orm/mapper.py", line 3249, in configure_mappers
    mapper._post_configure_properties()
  File "/home/spazzlo/.local/lib/python3.6/site-packages/sqlalchemy/orm/mapper.py", line 1947, in _post_configure_properties
    prop.init()
  File "/home/spazzlo/.local/lib/python3.6/site-packages/sqlalchemy/orm/interfaces.py", line 196, in init
    self.do_init()
  File "/home/spazzlo/.local/lib/python3.6/site-packages/sqlalchemy/orm/relationships.py", line 1914, in do_init
    self._process_dependent_arguments()
  File "/home/spazzlo/.local/lib/python3.6/site-packages/sqlalchemy/orm/relationships.py", line 1976, in _process_dependent_arguments
    self.target = self.entity.persist_selectable
  File "/home/spazzlo/.local/lib/python3.6/site-packages/sqlalchemy/util/langhelpers.py", line 855, in __get__
    obj.__dict__[self.__name__] = result = self.fget(obj)
  File "/home/spazzlo/.local/lib/python3.6/site-packages/sqlalchemy/orm/relationships.py", line 1899, in entity
    % (self.key, type(argument))
sqlalchemy.exc.ArgumentError: relationship 'audio' expects a class or a mapper argument (received: <class 'sqlalchemy.sql.schema.Table'>)

Tags: inpyselfhomesqlalchemylibpackageslocal
1条回答
网友
1楼 · 发布于 2024-07-04 09:06:59

您应该指向关系中的类名,而不是表名:

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship
from sqlalchemy import Column, String, Integer, ForeignKey

Base = declarative_base()

class Media(Base):

    __tablename__ = "media"
    id = Column(Integer, primary_key=True, unique=True, autoincrement=True)
    video_id = Column(String)
    audio = relationship("Audio", back_populates="media")  # changed 'audio' to 'Audio'

class Audio(Base):

    __tablename__ = "audio"
    id = Column(Integer, primary_key=True, unique=True, autoincrement=True)
    media_id = Column(Integer, ForeignKey("media.id"), nullable=True)
    media = relationship("Media", back_populates="audio")

相关问题 更多 >

    热门问题