Hi again!
Sorry for all the questions, here is another one.
What I really would like to do is to read a chunk of data for a mapped
instance and disseminate that into a number of attributes (not the usual
one column <-> one attribute mapping). This could easily be done using
an orm.reconstructor.
Writing to that data triggers an internal flag which I would like the
ORM to take into account to detect that the instance is dirty (even
better: signal the ORM at the same time that it is dirty). During flush,
I would like to have a orm.deconstructor ;-) method run that collects
the data from the instance attributes for flushing it to the database.
I am far from having this implemented. I tried starting with a simple
example using the MutableType mixin:
from sqlalchemy import *
from sqlalchemy.orm import *
from sqlalchemy.types import TypeDecorator, MutableType
import Image
import ImageEnhance
import numpy
from cStringIO import StringIO
engine = create_engine("sqlite:////tmp/test.db", echo=True)
class _ImageType(TypeDecorator):
impl = LargeBinary
def process_bind_param(self, value, dialect):
im = Image.fromarray(value)
fakefile = StringIO()
im.save(fakefile, 'png')
return fakefile.getvalue()
def process_result_value(self, value, dialect):
fakefile = StringIO(value)
return numpy.array(Image.open(fakefile))
class ImageType(MutableType, _ImageType):
def copy_value(self, value):
print "creating a copy"
return numpy.copy(value)
def compare_values(self, x, y):
print "compare: {0} vs. {1}".format(id(x), id(y))
result = (x == y).all()
print "result: {0}".format(result)
return result
metadata = MetaData()
image_table = Table("images", metadata,
Column("id", Integer, primary_key=True),
Column("image", ImageType))
metadata.create_all(engine)
class StoredImage(object):
def __init__(self, fname):
self.image = numpy.array(Image.open(fname))
mapper(StoredImage, image_table)
Session = sessionmaker(engine)
session = Session()
images = session.query(StoredImage).all()
if images:
for im in images:
data = im.image
for row in xrange(len(data)):
for col in xrange(len(data[0])):
r, g, b = data[row][col]
data[row][col] = b, g, r
# Image.fromarray(im.image).show()
print "dirty", session.dirty
else:
im = StoredImage("/usr/share/backgrounds/Daisy.jpg")
session.add(im)
session.commit()
This lacks almost everything that I really want:
o data is still in a single attribute
o no dirty flag handling, but full content comparison
o the comparison is run each time the ORM looks up its dirty instances.
Just pondering...
Torsten
--
DYNAmore Gesellschaft fuer Ingenieurdienstleistungen mbH
Torsten Landschoff
Office Dresden
Tel: +49-(0)351-4519587
Fax: +49-(0)351-4519561
mailto:[email protected]
http://www.dynamore.de
Registration court: Mannheim, HRB: 109659, based in Karlsruhe,
Managing director: Prof. Dr. K. Schweizerhof, Dipl.-Math. U. Franz
--
You received this message because you are subscribed to the Google Groups
"sqlalchemy" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/sqlalchemy?hl=en.