【问题标题】:Handle multiple parameter in SQL query using MySQLdb使用 MySQLdb 处理 SQL 查询中的多个参数
【发布时间】:2016-05-31 11:39:28
【问题描述】:

我有一个场景,我需要排除数千个具有特定域名的电子邮件 ID。

我当前的查询是

Select * from users where email NOT LIKE '%abc.com' 
                      AND email NOT LIKE '%efg.com'
                      AND email NOT LIKE '%xyz.com'            

当我转向 python 时,我写了一个类似的查询

MySQLcursor.execute (Select * from users where email NOT LIKE '%abc.com' 
                      AND email NOT LIKE '%efg.com'
                      AND email NOT LIKE '%xyz.com' )

我可以制作一个通用的域列表并将它们排除在外吗?

我试过的是

list_of_domains = ('%%abc.com','%%xyz.com','%%efg.com')
MySQLcursor.execute (Select * from users where email NOT LIKE %(exclude_domain)s, {"exclude_domain":list_of_domains} )

如果 list_of_domains 中只有 1 个值,它似乎可以工作。因为,当它解压列表时,它只能将“电子邮件不喜欢”条件与 1 个域列表匹配。

如何进行通用查询,以便如果明天,如果我有新域,我只需将其添加到 list_of_domains 即可。

我不确定这是否可能?有人可以帮忙吗?

【问题讨论】:

    标签: python mysql sql mysql-python sql-like


    【解决方案1】:

    我不喜欢使用字符串插值和连接来构造查询,但是,假设您无法更改表架构并且这是您必须执行的查询并且您信任域列表的来源,这里有一些东西可以帮助您开始:

    domains = [...]
    
    pattern = "email NOT LIKE '%{0}'"
    conditions = " AND ".join([pattern.format(domain) for domain in domains])
    query = "SELECT * FROM users WHERE " + conditions
    

    【讨论】:

    • 它实际上是在条件值后附加单引号。所以它变成 Select * from users where 'email NOT LIKE 'abc' AND email NOT LIKE 'def' ' 。我没有使用 + 条件来附加查询值,但我使用的是 query.execute("Select * from users where %s" ,(conditions))
    • @Neil 如果您想避免自动放置引号,则必须使用字符串连接(+ 条件)。
    猜你喜欢
    • 2011-06-04
    • 2016-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-28
    • 2013-12-14
    • 1970-01-01
    相关资源
    最近更新 更多