python - 在 mysql 中应用时,Python 的字符串格式会引发错误
问题描述
我用python编写了一个脚本来从网站上抓取一些数据并将它们存储在mysql中。如果我选择两个选项来插入数据,我的脚本会成功完成这项工作:
mycursor.execute("INSERT INTO webdata (name,bubble,review) VALUES ('{}','{}','{}')".format(name,bubble,review))
mycursor.execute("INSERT INTO webdata (name,bubble,review) VALUES (%s,%s,%s)",(name,bubble,review))
但是,当我尝试使用python 的新字符串格式执行相同操作时,它会引发错误,如下所示:
mycursor.execute("INSERT INTO webdata (name,bubble,review) VALUES (f'{name},{bubble},{review}')")
错误它抛出:
line 429, in _handle_result
raise errors.get_exception(packet)
mysql.connector.errors.ProgrammingError: 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''{name},{bubble},{review}')' at line 1
我哪里出了问题以及如何解决它,因为我非常愿意坚持最后的格式样式?
解决方案
最好让 MySQL 连接器使用 %s 绑定变量。这避免了 SQL 注入。这是一个工作示例。
import MySQLdb
# set up db connection
dbApi = MySQLdb
connection = MySQLdb.connect(
host = <hostname>,
user = <databasename>,
passwd = password,
db = <dbname>,
port = 3306,
charset = "utf8")
cursor = connection.cursor(dbApi.cursors.DictCursor)
# insert records
records = [['George', 'Ten', 'Good'],
['Ringo', 'Ten', 'Good'],
['Paul', 'Ten', 'Good'],
['John', 'Ten', 'Good']]
insert_sql = 'insert into webdata (name, bubble, review) values (%s, %s, %s)'
for record in records:
cursor.execute(insert_sql, record)
# list record
sql = 'select * from webdata'
cursor.execute(sql)
data = cursor.fetchall()
print 'data:', data
connection.commit()
cursor.close()
推荐阅读
- angular - 带有 HTMLElement 参考的 Angular Material 动态表单控制焦点
- python - /add 处的 MultiValueDictKeyError,请求方法:GET
- php - PHP数组差异而不使用array_diff
- node.js - Firebase 密码重置自定义
- anylogic - 通过方法参数化模拟实验的开始/停止日期
- android - 如何在 Retrofit 中使用 GET 方法发送 json 数据?
- go - 如何比较嵌套结构,子切片字段中的字段相同但顺序不同
- sql - 为表中的每个组选择第二个最晚日期
- swift - 为什么 SecPKCS12Import 总是返回错误代码 -26275?
- c# - 如何在 EF 迁移期间根据其他列的数据填充新列?