python插入和检索二进制数据到mysql

标签 python mysql binary

我正在使用 MySQLdb 包与 MySQL 进行交互。我无法获得正确的类型转换。

我使用一个 16 字节的二进制 uuid 作为表的主键,并且有一个 mediumblob 保存 zlib 压缩的 json 信息。

我正在使用以下架构:

CREATE TABLE repositories (
    added_id int auto_increment not null,
    id binary(16) not null,
    data mediumblob not null,
    create_date int not null,
    update_date int not null,
    PRIMARY KEY (added_id),
    UNIQUE(id)
) DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ENGINE=InnoDB;

然后我使用以下代码在表中创建一个新行:

data = zlib.compress(json.dumps({'hello':'how are you :D'})
row_id = uuid.uuid(4).hex
added_id = cursor.execute('
    INSERT INTO repositories (id, data, create_date, update_date) 
    VALUES (%s, %s, %s, %s)',
    binascii.a2b_hex(row_id), 
    data, 
    time.time(), 
    time.time()
)

然后我使用类似的查询来检索数据:

query = cursor.execute('SELECT added_id, id, data, create_date, update_date ' \
    'FROM repositories WHERE id = %s',
    binascii.a2b_hex(row_id)
)

然后查询返回一个空结果。

如有任何帮助,我们将不胜感激。另外,顺便说一句,将 unix 纪元日期存储为整数或 TIMESTAMP 更好吗?

注意:我在插入数据时没有遇到问题,只是试图从数据库中检索它。当我通过 mysqlclient 检查时,该行存在。

非常感谢!@

最佳答案

一个提示:您应该能够调用 uuid.uuid4().bytes 来获取原始数据 字节。至于时间戳,如果你想执行时间/日期操作 在 SQL 中,处理真实的 TIMESTAMP 类型通常更容易。

我创建了一个测试表来尝试重现您所看到的:

CREATE TABLE xyz (
    added_id INT AUTO_INCREMENT NOT NULL,
    id BINARY(16) NOT NULL,
    PRIMARY KEY (added_id),
    UNIQUE (id)
) DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ENGINE=InnoDB;

我的脚本能够使用二进制字段插入和查询行 key 没问题。也许您错误地获取/迭代了 游标返回的结果?

import binascii
import MySQLdb
import uuid

conn = MySQLdb.connect(host='localhost')

key = uuid.uuid4()
print 'inserting', repr(key.bytes)
r = conn.cursor()
r.execute('INSERT INTO xyz (id) VALUES (%s)', key.bytes)
conn.commit()

print 'selecting', repr(key.bytes)
r.execute('SELECT added_id, id FROM xyz WHERE id = %s', key.bytes)
for row in r.fetchall():
    print row[0], binascii.b2a_hex(row[1])

输出:

% python qu.py    
inserting '\x96\xc5\xa4\xc3Z+L\xf0\x86\x1e\x05\xebt\xf7\\\xd5'
selecting '\x96\xc5\xa4\xc3Z+L\xf0\x86\x1e\x05\xebt\xf7\\\xd5'
1 96c5a4c35a2b4cf0861e05eb74f75cd5
% python qu.py
inserting '\xac\xc9,jn\xb2O@\xbb\xa27h\xcd<B\xda'
selecting '\xac\xc9,jn\xb2O@\xbb\xa27h\xcd<B\xda'
2 acc92c6a6eb24f40bba23768cd3c42da

关于python插入和检索二进制数据到mysql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5241031/

相关文章:

c++ - 有 gtest 比较二进制的东西吗?

assembly - 将非常简单的 ARM 指令转换为二进制/十六进制

C# 划分两个二进制数

Python:如何在 eval 中访问 eval 的 globals()

python - 仅通过单击行标题选择 QTableWidget 行

mysql - 是否可以在 CakePHP 的 Controller 内获取模型错误代码?

php - ORM/Doctrine为ArrayCollections设置多个过滤器

php - AJAX 调用过多

python - 方法签名中的 "iterable[, key]"是什么意思?

python - 将类变量名传递给类方法