我正在使用pyodbc
将数据保存在Microsoft SQL Server中。
I 3个字符串变量user_first_name
,user_last_name
和profile_photo_path
user_first_name = 'Shams'
user_last_name = 'Nahid'
file_name = 'my_profile_photo_path'
现在当我尝试使用保存数据时
cursor.execute(f'''
INSERT INTO pyUser.dbo.user_information (first_name, last_name, profile_photo_path)
VALUES
({user_first_name}, {user_last_name}, {file_name})
''')
我收到以下错误
无效的列名\'Shams \'。
无效的列名\'Nahid \'。
无法绑定多部分标识符“ directory.PNG”。
但是,如果我放置了硬编码字符串,则不是变量,而是
cursor.execute('''
INSERT INTO pyUser.dbo.user_information (first_name, last_name, profile_photo_path)
VALUES
('my_user_first_name', 'my_user_last_name', 'my_file_name')
''')
然后查询没有显示错误。
我检查了变量类型user_first_name
,user_last_name
和file_name
,它们都是<class 'str'>
如何将变量放入查询中?
答案 0 :(得分:1)
使用字符串格式将列值插入SQL语句是一种危险的做法,因为它会将您的代码暴露给 SQL Injection 漏洞。例如,your answer中的代码将适用于
user_last_name = "Nahid"
但是它将失败
user_last_name = "O'Connor"
SQL注入也会带来严重的安全隐患。在网络上搜索“小鲍比表”以查看其示例。
相反,您应该像这样使用参数化查询:
user_first_name = 'Shams'
user_last_name = 'Nahid'
file_name = 'my_profile_photo_path'
sql = '''\
INSERT INTO pyUser.dbo.user_information (first_name, last_name, profile_photo_path)
VALUES (?, ?, ?)
'''
params = (user_first_name, user_last_name, file_name, )
cursor.execute(sql, params)
答案 1 :(得分:0)
通过在变量的两边都加上引号来解决。
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com 'unsafe-eval'; style-src 'self' 'unsafe-inline'; media-src *; img-src 'self' data: content:;">
<meta name="format-detection" content="telephone=no">
<meta name="msapplication-tap-highlight" content="no">
<meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width">
<script type="text/javascript" src="cordova.js"></script>
<script type="text/javascript" src="js/index.js"></script>
<title>SOOOUND!</title>
</head>
<body>
SOOOUND!
</body>
</html>
答案 2 :(得分:0)
或者您可以尝试
cursor.execute('''
INSERT INTO pyUser.dbo.user_information (first_name, last_name, profile_photo_path)
VALUES
("Shams", "Nahid", "my_profile_photo_path")
''')
答案 3 :(得分:0)
例如,我再试一次,这是可行的
import pymysql
def test():
db = pymysql.connect('localhost', 'root', '****', 'python')
cur = db.cursor()
id_ = "123456"
query = ''.join(["select *", " from customer where id = ", id_])
cur.execute(query)
result = cur.fetchone()
print("result: ", result)
if __name__ == '__main__':
test()