Python 使用MySQLdb处理SQL查询中的多参数

Python 使用MySQLdb处理SQL查询中的多参数,python,mysql,sql,mysql-python,sql-like,Python,Mysql,Sql,Mysql Python,Sql Like,我有一个场景,我需要排除数千个带有特定域名的电子邮件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

我有一个场景,我需要排除数千个带有特定域名的电子邮件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} )
如果在\u域的列表\u中只有1个值,则该方法似乎有效。因为,当它解压列表时,它只能将“email Not Like”条件与1个域列表相匹配

如何进行一般查询,以便如果明天有新域,我只需将其添加到\u域列表中,即可正常工作


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

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

domains = [...]

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

它实际上是在条件的值后面加上单引号。因此,它变成了Select*,来自“电子邮件不像”abc“和电子邮件不像”def“的用户。我没有使用+条件来附加查询值,但我使用的是query.execute(“Select*from users where%s”,(conditions))@Neil如果要避免自动放置引号,您必须使用字符串连接(+条件)。