Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Example using BLOB in SQLAlchemy

does anybody have example how to use BLOB in SQLAlchemy?

Regards, Steve

like image 220
user207253 Avatar asked Nov 22 '09 19:11

user207253


4 Answers

from sqlalchemy import *
from sqlalchemy.orm import mapper, sessionmaker
import os

engine = create_engine('sqlite://', echo=True)
metadata = MetaData(engine)

sample = Table(
    'sample', metadata,
    Column('id', Integer, primary_key=True),
    Column('lob', Binary),
)

class Sample(object):

    def __init__(self, lob):
        self.lob = lob

mapper(Sample, sample)

metadata.create_all()

session = sessionmaker(engine)()

# Creating new object
blob = os.urandom(100000)
obj = Sample(lob=blob)
session.add(obj)
session.commit()
obj_id = obj.id
session.expunge_all()

# Retrieving existing object
obj = session.query(Sample).get(obj_id)
assert obj.lob==blob
like image 190
Denis Otkidach Avatar answered Oct 09 '22 09:10

Denis Otkidach


from sqlalchemy import *
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base

from struct import *

_DeclarativeBase = declarative_base()

class MyTable(_DeclarativeBase):
    __tablename__ = 'mytable'
    id = Column(Integer, Sequence('my_table_id_seq'), primary_key=True)
    my_blob = Column(BLOB)

DB_NAME = 'sqlite:///C:/BlobbingTest.db'
db = create_engine(DB_NAME)
#self.__db.echo = True
_DeclarativeBase.metadata.create_all(db)
Session = sessionmaker(bind=db)
session = Session()

session.add(MyTable(my_blob=pack('H', 365)))
l = [n + 1 for n in xrange(10)]
session.add(MyTable(my_blob=pack('H'*len(l), *l)))
session.commit()

query = session.query(MyTable)
for mt in query.all():
    print unpack('H'*(len(mt.my_blob)/2), mt.my_blob)
like image 11
Jakub Koszuliński Avatar answered Oct 09 '22 08:10

Jakub Koszuliński


Why don't you use LargeBinary?

Extract from: https://docs.sqlalchemy.org/en/13/core/type_basics.html#sqlalchemy.types.LargeBinary

class sqlalchemy.types.LargeBinary(length=None)
A type for large binary byte data.

The LargeBinary type corresponds to a large and/or unlengthed binary type for the target platform, such as BLOB on MySQL and BYTEA for PostgreSQL. It also handles the necessary conversions for the DBAPI.

I believe this might assist you.

like image 4
Raphael Costa Avatar answered Oct 09 '22 09:10

Raphael Costa


From the documentation BINARY seems the way to go: http://docs.sqlalchemy.org/en/latest/dialects/mysql.html

class sqlalchemy.dialects.mysql.BLOB(length=None) Bases: sqlalchemy.types.LargeBinary

The SQL BLOB type.

__init__(length=None) Construct a LargeBinary type.

Parameters: length – optional, a length for the column for use in DDL statements, for those BLOB types that accept a length (i.e. MySQL). It does not produce a lengthed BINARY/VARBINARY type - use the BINARY/VARBINARY types specifically for those. May be safely omitted if no CREATE TABLE will be issued. Certain databases may require a length for use in DDL, and will raise an exception when the CREATE TABLE DDL is issued.

like image 1
algarecu Avatar answered Oct 09 '22 08:10

algarecu