python - 如何重构我的 python 以使用 SQL Prepared 语句?
问题描述
接受用户输入并为给定用户名提供用户的代码。现在它直接接受输入到 SQL 查询中,但我想将它与准备好的语句一起使用,我该怎么做?
# SELECT QUERIES
def get_all_results(q):
cur = mysql.connection.cursor()
cur.execute(q)
mysql.connection.commit()
data = cur.fetchall()
cur.close()
return data
# UPDATE and INSERT QUERIES
def commit_results(q):
cur = mysql.connection.cursor()
cur.execute(q)
mysql.connection.commit()
cur.close()
##### Returns a user for a given username
### in: username
### out: User
def get_user(username):
q = "SELECT * FROM Users"
q+= " WHERE username = '%s'" % (username)
logging.debug("get_user query: %s" % q)
data = get_all_results(q)
if len(data) == 1:
user = User(*(data[0]))
return user
else:
logging.debug("get_user: Something wrong happened with (username):(%s)" % (username))
return None```
解决方案
考虑调整您的查询方法以接受参数输入并在cursor.execute
. 这需要您替换 SQL 字符串中数据值的字符串格式
" WHERE username = '%s'" % (username)
带有一个没有数据的预准备语句,该语句稍后通过参数与数据绑定。
" WHERE username = %s"
不要将 unquoted%s
与带引号的'%s'
占位符混淆(在 Python 中不再推荐使用上面评论的后一种方法)。共:
# SELECT QUERIES
def get_all_results(q, p): # ADD NEW INPUT PARAMETER
cur = mysql.connection.cursor()
cur.execute(q, p) # PASS BOTH IN EXECUTE CALL
mysql.connection.commit()
data = cur.fetchall()
cur.close()
return data
# UPDATE and INSERT QUERIES
def commit_results(q, p): # ADD NEW INPUT PARAMETER
cur = mysql.connection.cursor()
cur.execute(q, p) # PASS BOTH IN EXECUTE CALL
mysql.connection.commit()
cur.close()
def get_user(username):
q = "SELECT * FROM Users WHERE username = %s" # PREPARED STATEMENT
logging.debug("get_user query: {}".format(q))
data = get_all_results(q, (username,)) # PASS PARAMETER AS TUPLE
# data = get_all_results(q, [username]) # PASS PARAMETER AS LIST
if len(data) == 1:
user = User(*(data[0]))
else:
msg = "get_user: Something wrong happened with username:{}".format(username)
logging.debug(msg)
user = None
return user
None
如果调用传递类型不需要参数。
data = get_all_results(q, None)
推荐阅读
- python - 从simpy中的线性组合生成列表
- cluster-computing - 点燃。活跃(真)?
- python - 如何根据数据框A和B的列之间的多个条件向数据框A添加一列?
- c# - 我可以根据文件夹使用不同的 web.config 文件吗?
- java - 使用 Java 中的 Jackson 在多行上编写 JSON 数组
- python - 使用索引之间的 1d 查找对 3d numpy 数组进行切片
- mongodb - 将一个集合的所有列数据复制到mongodb中的另一个集合中
- node.js - 如何验证 Node API 的请求者
- ios - 为什么 GeoFire 查询有时会使用以前加载的数据?
- python-3.x - 完成任务时出错
Pop!_OS 20.10 当我尝试启动 Lutris 时,它卡在“Lutris 正在启动”屏幕上。那是启动时的错误。
2021-04-14 12:49:03,094: Initializing lutris 2021-04-14 1