如何使用与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:无法在适当的模式中创建表

postgresql----Gist索引

如何使用 init.sql 在 Postgresql 中创建数据库、模式和表

如何使用 postgresql 为数据仓库星型模式制作简单的日维度表?

如何备份一些带有数据的表和一些表只有模式 PostgreSQL

如何从 CSV 为 PostgreSQL 副本生成模式