Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 传递正确的SQL语句-正确的方法是什么?_Python_Flask_Psql - Fatal编程技术网

Python 传递正确的SQL语句-正确的方法是什么?

Python 传递正确的SQL语句-正确的方法是什么?,python,flask,psql,Python,Flask,Psql,我的代码如下 selection_option_heading_1 = request.form.get("selection_option_heading").lower() search_string_1 = request.form.get("search_string").lower() search_string_1 = ("'%"+search_string_1+"%'") check_books_in_db = db2.execute(f"SELECT isbn, title, a

我的代码如下

selection_option_heading_1 = request.form.get("selection_option_heading").lower()
search_string_1 = request.form.get("search_string").lower()
search_string_1 = ("'%"+search_string_1+"%'")
check_books_in_db = db2.execute(f"SELECT isbn, title, author, year FROM books WHERE {selection_option_heading_1} ILIKE {search_string_1} LIMIT 50").fetchall()
return (check_books_in_db)
它正在工作


但我知道应该有一个合适的方法来做到这一点。有什么帮助吗?

通常,您不会像那样将用户输入直接注入SQL语句,因为这样会使您的代码容易受到SQL注入攻击。如果您使用python执行SQL查询,那么标准的mysql.connector库提供了基于用户输入执行查询的相对安全的方法

由于selection_option_heading_1是一个列名,因此最好在查询之前检查是否存在这样的列

例如:

SQL_col_query = "SELECT * FROM information_schema.columns
                 WHERE table_schema = 'your_schema'
                 AND table_name   = books"
cur.execute(SQL_col_query)
column_names = [row[0] for row in cur.fetchall()]
if ( selection_option_heading_1 in column_names) :
    SQL_query = f"SELECT isbn, title, author, year FROM books WHERE {selection_option_heading_1} ILIKE %S LIMIT 50"
    data = (selection_option_heading_1 , search_string_1 )
    cur.execute(SQL_query , data)
    ...

这无疑是一种比您现在所做的更安全的替代方法,但我不清楚这是否是执行此类查询的最佳方法。

正确的方法是使用ORM,这样您的代码将独立于后端数据库。请添加更多详细信息,如您使用的连接器等。标签
psql
使其看起来像PostgreSQL数据库,但psql是交互式shell,而不是Python模块。您使用哪个驱动程序?
sqlalchemy
如果helps@DipeshSukhani有点,是的,哪种方言?默认的
postgresql
(实际上是
psycopg2
)?也就是说,你的引擎创建是这样的:
engine=create_-engine('postgresql://)
?另一方面:如果你使用的是ORM,你的查询不应该看起来像类似于session.query(Book.filter)(getattr(用户,'selection_-option_-heading_-1')。ilike('%'+搜索_-string_-1+“%”)。limit(50)?我的意思是,如果您对ORM启动原始SQL,那么使用ORM有什么意义?我会立即给您+1以警告SQL注入攻击,但是:1)您传递的第一个“参数”(
,其中%s类似于
)实际上是一个列名;您不能在
execute
调用中提供这些类似的参数进行替换,2)这看起来不像MySQL数据库。标签
psql
ILIKE
(MySQL不支持)的使用看起来很像PostgreSQL