python - 使用 python 在 mySQL BLOB 中插入和检索 PDF

标签 python mysql pyqt

我有一个以 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。

有人可以帮忙吗?

最佳答案

失败是因为文件内容本质上是二进制的,而 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'。

[1] http://flylib.com/books/en/2.785.1.163/1/

PS:我没有测试过。

关于python - 使用 python 在 mySQL BLOB 中插入和检索 PDF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37223903/

相关文章:

python - 有和没有显式基类的类之间 __dict__ 的差异

mysql - 仅选择最大列

mysql - 插入 MySQL 时出现 DateTime 错误

python - 如何从一个类发出 Qtsignal,从而导致在 pyqt 中从其父类发出 Qtsignal

python - 从表格小部件到SQLite数据库的PYQT

python - Pandas 需要将 0.0 float 转换为空字符串,而不弄乱 Pandas 中的其他数字

python - 压缩到python中的特定目录

python - Pandas dataframe groupby 计算总体标准差

mysql - Yii中使用触发器时如何使用事务

python - pyqt qlabel仅显示字符串的第一个字符