2012-06-05 14 views
6

tabla:
Identificación del (tecla de número entero primario)
datos (BLOB)mysql Compress() con sqlalchemy

utilizo MySQL y sqlalchemy. para insertar datos que utilizo:

o = Demo() 
o.data = mydata 
session.add(o) 
session.commit() 

Me gustaría insertar a la mesa de esa manera:

INSERT INTO table(data) VALUES(COMPRESS(mydata)) 

¿Cómo puedo hacer esto usando sqlalchemy?

+0

'object = object()' no me parece una buena idea. Está sobrescribiendo el nombre de tipo 'objeto' ... – glglgl

+0

lo cambié. Gracias –

Respuesta

1

puede asignar una función SQL para el atributo:

from sqlalchemy import func 
object.data = func.compress(mydata) 
session.add(object) 
session.commit() 

Aquí hay un ejemplo usando una función más DB-agnóstico inferior():

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

Base= declarative_base() 

class A(Base): 
    __tablename__ = "a" 

    id = Column(Integer, primary_key=True) 
    data = Column(String) 

e = create_engine('sqlite://', echo=True) 
Base.metadata.create_all(e) 
s = Session(e) 

a1 = A() 
a1.data = func.lower("SomeData") 
s.add(a1) 
s.commit() 

assert a1.data == "somedata" 

que puede hacer que sea automático con @validates :

from sqlalchemy.orm import validates 
class MyClass(Base): 
    # ... 
    data = Column(BLOB) 

    @validates("data") 
    def _set_data(self, key, value): 
     return func.compress(value) 

si lo quiere legible en python antes del color, tendría que memorizarlo localmente y usa un descriptor para acceder a él.

Cuestiones relacionadas