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