如何在`pyodbc`查询中放入变量?

时间:2019-01-13 05:18:54

标签: python python-3.x pyodbc

我正在使用pyodbc将数据保存在Microsoft SQL Server中。

I 3个字符串变量user_first_nameuser_last_nameprofile_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_nameuser_last_namefile_name,它们都是<class 'str'>

如何将变量放入查询中?

4 个答案:

答案 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()