Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.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 在SQLAlchemy中连接表格的目的_Python_Python 3.x_Sqlalchemy - Fatal编程技术网

Python 在SQLAlchemy中连接表格的目的

Python 在SQLAlchemy中连接表格的目的,python,python-3.x,sqlalchemy,Python,Python 3.x,Sqlalchemy,我目前正在从原始SQL查询切换到SQLAlchemy包,我想知道什么时候加入这些表 我有三张桌子。男演员和电影处于一种默契关系。演员电影是连接表: class Actor(Base): __tablename__ = 'actor' act_id = Column(Integer, primary_key=True) last_name = Column(String(150), nullable=False, index=True) first_name =

我目前正在从原始SQL查询切换到SQLAlchemy包,我想知道什么时候加入这些表

我有三张桌子。男演员和电影处于一种默契关系。演员电影是连接表:

class Actor(Base):
    __tablename__ = 'actor'

    act_id = Column(Integer, primary_key=True)
    last_name = Column(String(150), nullable=False, index=True)
    first_name = Column(String(150), nullable=False, index=True)
    movies = relationship('Movie', secondary='actor_movie')

    def __init__(self, last_name, first_name):
        self.last_name = last_name
        self.first_name = first_name

class Movie(Base):
    __tablename__ = 'movie'

    movie_id = Column(Integer, primary_key=True)
    title = Column(String(150))
    actors = relationship('Actor', secondary='actor_movie')

    def __init__(self, title):
        self.title = title

class ActorMovie(Base):
    __tablename__ = 'actor_movie'

    fk_actor_id = Column(Integer, ForeignKey('actor.act_id'), primary_key=True)
    fk_movie_id = Column(Integer, ForeignKey('movie.movie_id'), primary_key=True)

    def __init__(self, fk_actor_id, fk_movie_id):
        self.fk_actor_id = fk_actor_id
        self.fk_movie_id = fk_movie_id
当我编写一个简单的查询时,如:

result = session.query(Movie).filter(Movie.title == 'Terminator').first()
我得到了电影对象和演员场。此演员字段包含与电影相关的所有演员的仪表化列表。当关系总是连接在一起时,这似乎是很大的开销

为什么会自动填充关系?何时需要手动加入? 根据结果,我甚至不确定连接表是否正确。这似乎是最“原始SQL”的方式。我还看到了替代方法I。e、 :

“当关系总是连接在一起时,这似乎是很大的开销。”

事实并非如此。默认情况下,关系在第一次被访问时执行选择操作,即所谓的延迟加载

“为什么会自动填充关系”

它是在实例上访问的,并且关系使用默认配置

“…我什么时候需要手动连接?”

例如,如果您需要根据相关表过滤查询,或者您正在获取许多电影,并且事先知道您将需要它们的全部或部分演员,但是对于多对多关系,selectin eager loading可能比join执行得更好

“根据结果,我甚至不确定连接表是否正确。”

这是正确的方法。SQLAlchemy是一种ORM,关系属性是映射的对象端,关联/连接表是关系端

总的来说,ORM的用途与原始SQL基本相同,但在某些情况下,ORM会在引擎盖下处理连接,例如,如果配置或指示这样做,则会立即加载。正如他们在主页上所说:

SQLAlchemy是Python SQL工具包和对象关系映射器,它为应用程序开发人员提供了SQL的全部功能和灵活性


非常感谢你!我有最后一个关于m:n表的问题,以及加入时可能出现的问题。sqlalchemy文档说我不应该在模式中使用次要属性。我宁愿使用back_populate属性来保持值同步。有什么理由不使用back_填充吗?我想你可能有点误读了。文档建议使用
back\u填充
backref
,而不是
secondary
。2控件链接两个模型之间的对象关系属性,而
secondary
是关系端两个模型之间的关联关系/表。不,我想我没有误读文档。查看章节关联表:我引用以下句子:,,而不是使用第二个参数,您将一个新类直接映射到关联表“这是关联对象模式,它是多对多的一种形式,允许在关联中包含其他信息。而不是“是指将辅助表建模为映射类。混合使用这两种方法确实会带来一些惊喜,但在您的示例中,这并不重要。但是:这不是关于“次要”和“落后人群”。