Python 搜索任何包含以下内容的文本。。。在Postgresql中

Python 搜索任何包含以下内容的文本。。。在Postgresql中,python,postgresql,wildcard,psycopg2,Python,Postgresql,Wildcard,Psycopg2,我想对返回所有结果的通配符执行SQL查询 SELECT * FROM my_table WHERE column1 IN ('*'); 其想法是按需注入项目,如: import psycopg2 conn = psycopg2.connect(DSN) curs = conn.cursor() def my_func(filter='*'): curs.execute("""SELECT * FROM my_table

我想对返回所有结果的通配符执行SQL查询

SELECT *
FROM my_table
WHERE column1 IN ('*');
其想法是按需注入项目,如:

import psycopg2
conn = psycopg2.connect(DSN)
curs = conn.cursor()

def my_func(filter='*'):
    curs.execute("""SELECT *
                    FROM my_table
                    WHERE column1 IN (%s);""" % filter)
    return curs.fetchall()

my_func(filter=['value 1', 'value 2'])
# or
my_func()

后面的(
*
)在
my\u func
过滤器中不起作用。如果我猜对了的话,有什么可以做的吗?

您需要一个函数,默认情况下,您可以调用该函数返回所有内容。但是,如果将参数传递给函数,则希望能够进行更窄范围的过滤

您希望(…)
中的
列表相当于在“%”之类的地方写入
。i、 e.它匹配所有可能的输入,并且始终为真。然后,可以将
'%'
设置为查询参数,以后可以用其他值替换

如果是:在(…)
列表中没有对应的
。那是不可能的<(1,2)中的code>somecol
相当于
somecol=ANY(数组[1,2])
。SQL中没有等于所有参数的值。这毫无意义

NULL
,它不等于所有输入,包括其自身。所以你可以写:

。。。但是如果你这样做,你会让全世界的程序员哭的。我甚至写它都觉得很脏。此外,它还将迫使您将整个筛选器列表写为否定(即,将筛选器指定为“摆脱这些东西”而不是“保留这些东西”),这甚至可能是不可能的,也可能是不切实际的

试图不修改查询是徒劳的。即使有可能,这也是一个非常糟糕的主意,因为它效率非常低。您需要使用动态SQL

类似于(未经测试):

这就是为什么存在查询生成器、ORM等。因为SQL是一种很好的语言,可以准确地表达你想要的东西,也是一种非常糟糕的语言,可以用不同的方式构造不同的请求

Python中有很多这样的工具。你可能想看看


旁注:您的原始代码非常不安全。不要在SQL中像那样使用字符串格式。想象一下,如果有人设法欺骗您的程序,使其通过过滤器值
”;放下桌子我的桌子--到您的代码:

curs.execute("""SELECT *
                FROM my_table
                WHERE column1 IN (%s);""" % filter)
轰!这是你的桌子

这就是为什么必须使用查询参数。您的代码至少应该是:

curs.execute("""SELECT *
                FROM my_table
                WHERE column1 IN (%s);""", (filter,))
详情请参阅:

  • -阅读有关传递查询参数的部分

您使用的是什么编程语言?此外,SQL中的“通配符”通常由my_表中的
%
select*表示,其中column1不为NULL
(或
从my_表中选择*,其中1=1;
)@Kenney Python-为什么这很重要@wildplasser我想使用
其中。。。在
中(如果可能)。从psycopg2文档中:在(%s)中使用,并将数组作为参数传递。[在:list adaption下]@n1000我想wildplasser的意思是Python
list
,例如
[1,2,3]
啊,非常感谢!!这正是我需要的建议
NULL
似乎不起作用,但无论如何,我宁愿现在尝试实现您的建议。也感谢您的旁注。我知道sql注入。但是,当我的(模拟)程序永远不会被除我以外的任何人使用时,这是否也有问题?还是我应该问一个新的SO问题?:)@n1000如果它是一个真正的封闭系统-你不能从外部世界获得输入,你是唯一的用户-那么当然,写代码时要尽可能不安全。不过,请记住。。。您作为概念证明而编写的快速黑客原型将在10年后仍在生产中运行。如果代码有可能在野外逃逸,那就做对。更好的是,无论如何都要做对,这样你就不会养成坏习惯和/或意外地向其他人展示坏的例子,而这些人在不了解上下文的情况下复制它们。
curs.execute("""SELECT *
                FROM my_table
                WHERE column1 IN (%s);""" % filter)
curs.execute("""SELECT *
                FROM my_table
                WHERE column1 IN (%s);""", (filter,))