首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用sqlalchemy编写多列子句

如何用sqlalchemy编写多列子句
EN

Stack Overflow用户
提问于 2013-12-09 02:04:48
回答 3查看 4.3K关注 0票数 11

请建议使用SQLAlchemy编写查询多列子句的方法吗?

下面是实际查询的示例:

代码语言:javascript
复制
SELECT  url FROM pages WHERE (url_crc, url) IN ((2752937066, 'http://members.aye.net/~gharris/blog/'), (3799762538, 'http://www.coxandforkum.com/'));

我有一个有两个列的表--主键,我希望避免再添加一个键作为索引。

我正在使用mysql。

更新:这个查询将用于批处理-所以我需要在in子句中放入几百对。使用IN子句方法,我希望知道有多少对可以固定在一个查询中。与Oracle一样,默认情况下有1000枚举限制。

使用和/或组合可能会受到字符中查询长度的限制。这是可变的,也是不可预测的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-12-13 21:53:30

我最后使用了基于test()的解决方案:生成"(a,b) in (:A1,:b1),(:a2,:b2),.“使用命名的bind和生成具有bind值的字典。

代码语言:javascript
复制
params = {}
for counter, r in enumerate(records):
    a_param = "a%s" % counter
    params[a_param] = r['a']
    b_param = "b%s" % counter
    params[b_param] = r['b']
    pair_text = "(:%s,:%s)" % (a_param, b_param)
    enum_pairs.append(pair_text)
multicol_in_enumeration = ','.join(enum_pairs)
multicol_in_clause = text(
    " (a,b) in (" + multicol_in_enumeration + ")")
q = session.query(Table.id, Table.a,
                            Table.b).filter(multicol_in_clause).params(params)

我还考虑了使用mysql上服务器的另一种选择,但这将使整个包含对于另一个db引擎的可移植性更低,然后使用多个clause in子句。

Update SQLAlchemy具有可用于相同目的的(千瓦)构造。(我还没试过)

票数 0
EN

Stack Overflow用户

发布于 2015-11-10 13:47:48

假设您在Page中定义了模型,下面是一个使用tuple_的示例

代码语言:javascript
复制
keys = [
    (2752937066, 'http://members.aye.net/~gharris/blog/'),
    (3799762538, 'http://www.coxandforkum.com/')
]
    
select([
    Page.url
]).select_from(
    Page
).where(
    tuple_(Page.url_crc, Page.url).in_(keys)
)

或者,使用查询API:

代码语言:javascript
复制
session.query(Page.url).filter(tuple_(Page.url_crc, Page.url).in_(keys))
票数 18
EN

Stack Overflow用户

发布于 2013-12-09 14:46:06

我认为这在sqlalchemy中是不可能的,而且并非所有的RDMBS都支持这一点。

但是,始终可以将其转换为OR(AND...)条件:

代码语言:javascript
复制
filter_rows = [
    (2752937066, 'http://members.aye.net/~gharris/blog/'),
    (3799762538, 'http://www.coxandforkum.com/'),
    ]
qry = session.query(Page)
qry = qry.filter(or_(*(and_(Page.url_crc == crc, Page.url == url) for crc, url in filter_rows)))
print qry

应该生成类似于(针对SQLite)的内容:

代码语言:javascript
复制
SELECT  pages.id AS pages_id, pages.url_crc AS pages_url_crc, pages.url AS pages_url
FROM    pages
WHERE   pages.url_crc = ? AND pages.url = ? OR pages.url_crc = ? AND pages.url = ?
-- (2752937066L, 'http://members.aye.net/~gharris/blog/', 3799762538L, 'http://www.coxandforkum.com/')

Alternatively,--您可以将两列组合成一个:

代码语言:javascript
复制
filter_rows = [
    (2752937066, 'http://members.aye.net/~gharris/blog/'),
    (3799762538, 'http://www.coxandforkum.com/'),
    ]
qry = session.query(Page)
qry = qry.filter((func.cast(Page.url_crc, String) + '|' + Page.url).in_(["{}|{}".format(*_frow) for _frow in filter_rows]))
print qry

生成以下内容(用于SQLite),因此您可以使用IN

代码语言:javascript
复制
SELECT  pages.id AS pages_id, pages.url_crc AS pages_url_crc, pages.url AS pages_url
FROM    pages
WHERE   (CAST(pages.url_crc AS VARCHAR) || ? || pages.url) IN (?, ?)
-- ('|', '2752937066|http://members.aye.net/~gharris/blog/', '3799762538|http://www.coxandforkum.com/')
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20461887

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档