我有一个带有LONGBLOB数据类型的mysql表作为其中一列。我想在该列中插入PDF。我试过这个。
file = open(r'path to file\myfile.pdf', 'rb').read()
id='2'
q1 = QSqlQuery("INSERT INTO table_1 (id_val,pdf_name) VALUES (%s,%s)"%(id,file))
此代码未将id_val和PDF插入表中,并且未显示任何错误。然后我拆分了代码。
file = open(r'path to file\myfile.pdf', 'rb').read()
id='2'
q1 = QSqlQuery("INSERT INTO table_1 (id_val) VALUES (%s)"%(id))
q2 = QSqlQuery("UPDATE table_1 SET pdf_name=%s WHERE id_val='2'"%(file))
此代码将id_val插入表中,但不更新BLOB pdf。
有人可以帮忙吗?
答案 0 :(得分:1)
它失败了,因为文件内容本质上是二进制的,并且sql命令将它与文本数据连接。
为了实现这一点,人们必须对数据进行编码,以便它可以在不跳过MySQL的命令解析器的情况下执行命令。
一种方法是base64
对内容进行编码,使其映射到ascii字符集。
import base64
with open('path to your pdf', 'rb) as f:
blob = base64.b64encode(f.read())
现在将此blob插入数据库中。
另一种更标准的方法是遵循[1]中的建议并使用`MySQLdb.escape_string'。
PS:我还没有测试过它们。答案 1 :(得分:0)
我能够将PDF作为BLOB插入,但代码稍作修改。
file = open(r'path to file\file.pdf', 'rb').read()
id='2'
q1= 'INSERT INTO table_1(id_val,pdf_name) VALUES(%s,%s)'
a1 = (id,file)
cursor=db.cursor()
cursor.execute(q1,a1)