MySQL Compress () с sqlalchemy

table:
id(целочисленный первичный ключ)
data(Блоб)

Я использую mysql и sqlalchemy. Для вставки данных я использую:

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

Я хотел бы вставить в таблицу так:

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

Как я могу сделать это с помощью sqlalchemy?

 glglgl10 июл. 2012 г., 13:02
object = object() кажется, не очень хорошая идея для меня. Вы перезаписываете имя типаobject...
 Giorgos Komnino10 июл. 2012 г., 13:06
я изменил это. Спасибо

Ответы на вопрос(1)

Решение Вопроса

Вы можете назначить функцию SQL для атрибута:

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

Вот пример, использующий более низкую функцию DB ():

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"

Вы можете сделать это автоматически с @validates:

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

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

если вы хотите, чтобы он читался в python до сброса, вам нужно запомнить его локально и использовать дескриптор для доступа к нему.

Ваш ответ на вопрос