【问题标题】:SQLAlchemy - How to create a one-to-many relationship with no items?SQLAlchemy - 如何创建没有项目的一对多关系?
【发布时间】:2020-05-10 03:36:39
【问题描述】:

我正在尝试在 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'>)

【问题讨论】:

    标签: python python-3.x orm sqlalchemy


    【解决方案1】:

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

    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")
    

    【讨论】:

      猜你喜欢
      • 2016-03-31
      • 2018-02-02
      • 1970-01-01
      • 1970-01-01
      • 2019-01-12
      • 1970-01-01
      • 1970-01-01
      • 2016-04-06
      • 1970-01-01
      相关资源
      最近更新 更多