Python 在SQLAlchemy中连接表格的目的
我目前正在从原始SQL查询切换到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 =
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
是关系端两个模型之间的关联关系/表。不,我想我没有误读文档。查看章节关联表:我引用以下句子:,,而不是使用第二个参数,您将一个新类直接映射到关联表“这是关联对象模式,它是多对多的一种形式,允许在关联中包含其他信息。而不是“是指将辅助表建模为映射类。混合使用这两种方法确实会带来一些惊喜,但在您的示例中,这并不重要。但是:这不是关于“次要”和“落后人群”。