如何使用与PostgreSQL和Python的模式匹配与多个百分比(%)符号?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用与PostgreSQL和Python的模式匹配与多个百分比(%)符号?相关的知识,希望对你有一定的参考价值。
我正在尝试使用LIKE LOWER('% %')
命令进行模式匹配,但是我认为我使用带有%s的python变量这一事实正在破坏它。我似乎无法找到百分比符号的任何转义字符,我的程序没有给我任何错误。这是问题还是我还缺少其他东西。如果我只运行LIKE %s
它确实有效,但我需要能够搜索不等于。
# Ask for the database connection, and get the cursor set up
conn = database_connect()
if(conn is None):
return ERROR_CODE
cur = conn.cursor()
print("search_term: ", search_term)
try:
# Select the bays that match (or are similar) to the search term
sql = """SELECT fp.name AS "Name", fp.size AS "Size", COUNT(*) AS "Number of Fish"
FROM FishPond fp JOIN Fish f ON (fp.pondID = f.livesAt)
WHERE LOWER(fp.name) LIKE LOWER('%%s%') OR LOWER(fp.size) LIKE LOWER('%%s%')
GROUP BY fp.name, fp.size"""
cur.execute(sql, (search_term, ))
rows = cur.fetchall()
cur.close() # Close the cursor
conn.close() # Close the connection to the db
return rows
except:
# If there were any errors, return a NULL row printing an error to the debug
print("Error with Database - Unable to search pond")
cur.close() # Close the cursor
conn.close() # Close the connection to the db
return None
答案
您可以将搜索字符串包装在&符号中,然后将其传递给cursor.execute()
,而不是将&符号嵌入查询字符串中:
sql = 'SELECT * from FishPond fp WHERE LOWER(fp.name) LIKE LOWER(%s)'
search_term = 'xyz'
like_pattern = '%{}%'.format(search_term)
cur.execute(sql, (like_pattern,))
出于示例的目的简化了查询。
这更灵活,因为调用代码可以将任何有效的LIKE模式传递给查询。
顺便说一句:在Postgresql中你可以使用ILIKE
来表示case insensitive pattern matching,所以示例查询可以写成:
sql = 'SELECT * from FishPond fp WHERE fp.name ILIKE %s'
如文档中所述,ILIKE
是Postgresql扩展,而不是标准SQL。
另一答案
你可以用另一个%
逃离%
>>> test = 'test'
>>> a = 'LIKE %%s%'
>>> a % test
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: incomplete format
>>>
>>> a = 'LIKE %%%s%%'
>>> a % test
'LIKE %test%'
附:你也有两个占位符,但你只在execute
中传递一个参数
以上是关于如何使用与PostgreSQL和Python的模式匹配与多个百分比(%)符号?的主要内容,如果未能解决你的问题,请参考以下文章
带有 Postgresql 的 Grails:无法在适当的模式中创建表
如何使用 init.sql 在 Postgresql 中创建数据库、模式和表
如何使用 postgresql 为数据仓库星型模式制作简单的日维度表?