回答

收藏

在SQLAlchemy中,``过滤器''与``填充和过滤器''语法之间有

技术问答 技术问答 251 人阅读 | 0 人回复 | 2023-09-12

更具体地说,我看到很多人没有使用它SQLAlchemy中的类似SQL自然连接语法倾向于使用过滤器进行连接。以下是我如何添加连接的方法:8 G+ j! e) O, J" i1 M" ?
(session.Query(Book)        .join(Author,Publisher,Retailer)        .filter(               Author.name == "Crenshaw Adams",           Publisher.country == "United States",           Retailer.is_online == True))在模型声明文件中定义的关系中隐含连接列。
1 l% V& z' \' n3 W但在任何其他地方(尤其是在StackOverflow上),我看到人们这样做:
) R" F2 Q6 k! t$ E) f# s(session.Query(Book)        .filter(               Book.author_id == Author.id,           Author.publisher_id == Publisher.id,           Publisher.retailer_id == Retailer.id,           Author.name == "Crenshaw Adams",           Publisher.country == "United States",           Retailer.is_online == True       哪种方法是正确的方法?哪个更合适?Pythonic?或者,至少,应该使用SQLAlchemy这种方式更常用吗?数据库资源的使用或本地计算机资源的使用是否存在差异(即,是的DB的CPU和RAM对本地计算机的压力更大,反之亦然)?
4 Z7 ?! e# }! w5 e$ l) F$ m此外,前一种方法不允许update()Query API上的方法-即使不能只更新一个表,也会抱怨不允许更新多个表。后者允许update()正常工作。
" m7 ?" J( w/ c% p. Q                                                                  {, x& C" c9 ^) ?* }
    解决方案:                                                               
4 `5 u" }; }8 T9 n                                                                主要区别在于前者会导致查询使用SQL-92& E% G* b% w3 e$ R& f* C
JOIN语法,后者使用旧语法-
8 u3 [$ d/ a7 k- M3 {( Z例如,有些人出于习惯而不喜欢它。两者都是正确的方法,两者都是否使用Python语言无关。我也认为,SQLAlchemy语言不常用,但是Query.join()正如你所指出的,它与定义的外键关系和ORM关系很好地配合使用。SQL
: o" u+ z. W3 cDBMS它们还应导致相同的执行计划,因此在资源使用等方面没有意义的区别。6 ~* w$ t2 s, m) T; ?4 F
关于Query.update()不同的问题不支持显式连接SQL
' }: {5 F# W' q& D: l0 cDBMS对不同语法和方法的多表更新有不同的支持。有的允许显式连接,有的不允许,有的允许通过子查询更新。目前的实现似乎是一个折衷的解决方案,将是UPDATE使用中的DBMS提供适当的声明。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则