Hi everybody.
After reading the documentation on dictionary based collections at
<http://www.sqlalchemy.org/docs/mappers.html#dictionary-based-collections>, I
am wondering if I am the only one who things that this code is intuitive:
item = Item()
item.notes['color'] = Note('color', 'blue')
print item.notes['color']
I'd rather write
item.notes['color'] = Note('blue')
That the key is stored with the value should be an implementation
detail I think.
I extended sqlalchemy.orm.collections.MappedCollection with a few lines
to implement this (attached).
Shouldn't something like this be included with SQLAlchemy? Or is this a
bad idea?
Greetings, 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.
import operator
import sqlalchemy as sa
import sqlalchemy.orm as orm
from sqlalchemy.orm.collections import MappedCollection
class MyMappedCollection(MappedCollection):
def __init__(self, key_attr):
super(MyMappedCollection, self).__init__(operator.attrgetter(key_attr))
self._key_attr = key_attr
def __setitem__(self, key, value):
setattr(value, self._key_attr, key)
if key in self:
del self[key]
super(MappedCollection, self).__setitem__(key, value)
def map_on(attr):
return lambda: MyMappedCollection(attr)
metadata = sa.MetaData()
item_table = sa.Table("item", metadata,
sa.Column("id", sa.Integer, primary_key=True))
note_table = sa.Table("note", metadata,
sa.Column("id", sa.Integer, sa.ForeignKey(item_table.c.id), primary_key=True, index=True),
sa.Column("key", sa.String, primary_key=True),
sa.Column("value", sa.String),
sa.Column("desc", sa.String))
class Item(object): pass
class Note(object):
def __init__(self, **args): self.__dict__.update(args)
orm.mapper(Note, note_table)
orm.mapper(Item, item_table, properties=dict(
note=orm.relation(Note, cascade="all,delete-orphan", collection_class=map_on("key"))))
engine = sa.create_engine("sqlite:///")
metadata.create_all(engine)
session = orm.sessionmaker(bind=engine)()
item = Item()
item.note["color"] = Note(value="blue", desc="This should be blue because")
item.note["shape"] = Note(value="rectangular")
session.add(item)
session.commit()