0

所以我有一个简单的芬兰和瑞典名字城镇表:

CREATE TABLE town (id SERIAL PRIMARY KEY, name_fi TEXT, name_sv TEXT);

我需要检查一个特定的城镇是否存在。这很容易:

cursor.execute(
    "SELECT EXISTS ( SELECT 1 FROM town WHERE name_fi=%s OR name_sv=%s )",
    (town, town)
)
result = cursor.fetchone()  # True/False

但现在我需要为多个城镇执行此操作,以确保它们存在:

for town in towns:
    # Code for one town from above
    if result is False:
        return False
return True

有没有办法用一个查询而不是使用 Pythonfor循环来做到这一点?

4

1 回答 1

0

将城镇作为列表传递:

cities = ['Paris', 'London']
template = ','.join(['%s'] * len(cities))

根据需要加入和聚合:

query = '''
    select bool_and(name_fi is not null or name_sv is not null)
    from
        town
        right join
        (values {}) s (name) on name in (name_fi, name_sv)
'''.format(template)

print (cursor.mogrify(query, [tuple((city,)) for city in cities]).decode('utf8'))
cursor.execute(query, [tuple((city,)) for city in cities])

结果是True要么False

print cursor.fetchone()[0]

输出:

select bool_and(name_fi is not null or name_sv is not null)
from
    town
    right join
    (values ('Paris'),('London')) s (name) on name in (name_fi, name_sv)

True

对于 Python 部分,请检查此答案

于 2017-02-27T13:03:34.217 回答