微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决python在mysql中插入和检索二进制数据

提示:您应该可以调用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;

我的脚本能够使用二进制字段作为键插入并查询行,而不会出现问题。也许您不正确地获取/迭代了游标返回的结果?

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

解决方法

我正在使用MySQLdb包与MySQL进行交互。我在获取正确的类型转换时遇到麻烦。

我正在使用一个16字节的二进制uuid作为该表的主键,并且有一个中号持有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)',binascii.a2b_hex(row_id),time.time(),time.time()
)

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

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

然后查询返回空结果。

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

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

非常感谢!@

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。