2009-11-22 9 views
13

hat jemand Beispiel, wie man BLOB in SQLAlchemy verwendet?Beispiel mit BLOB in SQLAlchemy

Grüße, Steve

+2

Ich möchte ein Beispiel sehen, das ohne die ORM funktioniert. Ich denke, in diesem Fall müssen Sie den Blob-Wert, der an Connection.execute übergeben wurde, irgendwie umbrechen. –

Antwort

16
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 
4
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) 
+0

Vorteile der Verwendung von Pack. +1 – pylover

0

Aus der Dokumentation BINARY scheint den Weg zu gehen: http://docs.sqlalchemy.org/en/latest/dialects/mysql.html

Klasse sqlalchemy.dialects.mysql.BLOB (Länge = None) Basen: sqlalchemy.types.LargeBinary

Der SQL-BLOB-Typ.

init (length = None) Konstruieren Sie einen LargeBinary-Typ.

Parameter: Länge - optional, eine Länge für die Spalte für die Verwendung in DDL Anweisungen, für die BLOB-Typen, die eine Länge (d. H. MySQL) akzeptieren. Es erzeugt keinen verlängerten BINARY/VARBINARY-Typ - verwenden Sie die BINARY/VARBINARY-Typen speziell für diese. Kann sicher weggelassen werden , wenn keine CREATE TABLE ausgegeben wird. Bestimmte Datenbanken benötigen möglicherweise eine Länge von für die Verwendung in DDL und verursachen eine Ausnahme, wenn die CREATE TABLE DDL ausgegeben wird.