python - 使用 psycopg2 和 POSTGRESQL 在 Python 中为 SELECT 查询的可选参数更正函数定义
问题描述
我想在函数中使用可选的过滤器参数从我的 PostgreSQL 数据库中进行 SELECT,但我正在努力获得正确的语法。
def search(title: str = '', author: str = "", year: int, isbn: int):
conn = psycopg2.connect(
" dbname='mydb' user='postgres' password='pwd' host='localhost' port='5432' ")
curs = conn.cursor()
curs.execute("SELECT * FROM book WHERE title=? OR author=? OR year=? OR isbn=?",
(title, author, year, isbn))
rows = curs.fetchall()
conn.close()
return rows
然后我想通过只向函数传递一个参数(作者姓名)来进行搜索,并让 SELECT 语句能够忽略/跳过尚未传递的字段。当我执行
print(search(author="John"))
输出是
Traceback (most recent call last):
File "backend.py", line 48, in <module>
print(search(author="John"))
File "backend.py", line 39, in search
(title, author, year, isbn))
psycopg2.errors.UndefinedFunction: operator does not exist: text =?
LINE 1: SELECT * FROM book WHERE title=? OR author=? OR year=? OR is...
^
HINT: No operator matches the given name and argument type. You might need to add an explicit type cast.
我知道这与 SELECT 语句的数据类型和数据库列类型之间的不匹配有关,并且该错误反映了没有 = 运算符来比较这两种数据类型。但是如何定义我的函数参数和 SELECT 语句以使我的查询工作?
解决方案
psycopg2%s
用作字符串替换的占位符,而不是?
. 尝试更改 ? 到 %s,它应该可以工作。
编辑:@Parfait 对你的 where 逻辑提出了一个很好的观点。改变?to %s 将修复您的语法错误,但仍无法修复逻辑。处理此问题的一种常见方法是将所有参数默认为None
并将查询更改为以下内容:
curs.execute("""
SELECT * FROM BOOK
WHERE (title = %(title)s OR %(title)s IS NULL)
AND (author = %(author)s OR %(author)s IS NULL)
AND (year = %(year)s OR %(year)s IS NULL)
AND (isbn = %(isbn)s OR %(isbn)s IS NULL)""",
{"title": title, "author": author, "year": year, "isbn": isbn})
这不是最高效的方法,但它可能是最简单的。
推荐阅读
- mysql - 如何通过 cakephp phinx 迁移迁移列类型 DOUBLE?
- java - Java 对 ArrayList 中的 ArrayList 进行排序
- javascript - 如何在 Angular 中捕获价值 3 组件
- azure - 在没有“直接”互联网连接的情况下使用 Azure 服务总线,SendVia?
- bash - 如何将参数从 git 别名传递到外部脚本
- azure - AWS ECR PULL 没有基本的身份验证凭证
- erlang - 找不到 .erlang.cookie 文件
- generator - 实现一个 NONinfinite 生成器
- arrays - 是否可以在laravel中的Array ['在此处添加变量']中分配变量
- javascript - 如何在 php 中的锚 url 中传递参数