在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提供适当的声明。 |
|
|
|
|
|