如何在SQLAlchemy中使用二进制数据?

时间:2010-02-11 23:38:16

标签: sqlalchemy

如何在SQLAlchemy中使用二进制数据(BLOB类型列)。

我刚创建了一个包含字段keyval的表,其中val是BLOB,当我查询表时,SQLAlchemy返回:

<read-only buffer for 0x83c3040, size -1, offset 0 at 0x83c3120>

如何使用此只读缓冲区?

2 个答案:

答案 0 :(得分:1)

你可以迭代它(例如用于流式传输)或将其转换为字符串/二进制文件,如果你想将整个二进制文件存储在内存中(只要你不处理电影,这应该不是问题)数据库......)

>>> from sqlalchemy.util import buffer
>>> var = buffer('foo')
>>> var
<read-only buffer for 0xb727fb00, size -1, offset 0 at 0xb727fa80>
>>> str(var)
'foo'
>>> for i in var:
...   print i
... 
f
o
o

此致 克里斯托弗

答案 1 :(得分:0)

在SQLAlchemy 1.3中,使用Python2,二进制数据以str的形式返回,而在Python 3中则为bytes

# -*- coding: utf-8 -*-
import zlib

import sqlalchemy as sa
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import orm

Base = declarative_base()


class Blobby(Base):
    __tablename__ = 'blobby'

    id = sa.Column(sa.Integer, primary_key=True)
    blob = sa.Column(sa.BLOB)


engine = sa.create_engine('mysql+pymysql:///test', echo=True)
Base.metadata.drop_all(bind=engine, checkfirst=True)
Base.metadata.create_all(bind=engine)

Session = orm.sessionmaker(bind=engine)

session = Session()
data = zlib.compress('Hello world'.encode('ascii'))
session.add(Blobby(blob=data))
session.commit()

blob, = session.query(Blobby.blob).first()
print(type(blob), blob)
session.close()

Python2输出

(<type 'str'>, 'x\x9c\xf3H\xcd\xc9\xc9W(\xcf/\xcaI\x01\x00\x18\xab\x04=')

Python3输出:

<class 'bytes'> b'x\x9c\xf3H\xcd\xc9\xc9W(\xcf/\xcaI\x01\x00\x18\xab\x04='