2009-09-09 12 views
6

Estoy trabajando en una base de código bastante grande que se ha implementado usando sqlalchemy.ext.declarative, y necesito agregar una propiedad similar a dict a una de las clases. Lo que necesito es lo mismo que en this question, pero de manera declarativa. ¿Alguien con más conocimiento en SQLAlchemy me puede dar un ejemplo? Gracias de antemano ...Diccionario de etiquetas en SQLAlchemy declarativa?

+0

Si no necesita consultar sobre la propiedad, esta respuesta ofrece un enfoque alternativo: http://stackoverflow.com/questions/1378325/python-dicts-in-sqlalchemy/1378818#1378818 –

Respuesta

13

Declarativo es solo otra forma de definir las cosas. Virtualmente terminas con el mismo ambiente exacto que si usaras un mapeo separado.

Como respondí la otra pregunta, probaré esta también. Espero que da más upvotes;)

Bueno, primero definimos las clases

from sqlalchemy import Column, Integer, String, Table, create_engine 
from sqlalchemy import orm, MetaData, Column, ForeignKey 
from sqlalchemy.orm import relation, mapper, sessionmaker 
from sqlalchemy.orm.collections import column_mapped_collection 
from sqlalchemy.ext.associationproxy import association_proxy 
from sqlalchemy.ext.declarative import declarative_base 

engine = create_engine('sqlite:///:memory:', echo=True) 
Base = declarative_base(bind=engine) 

class Note(Base): 
    __tablename__ = 'notes' 

    id_item = Column(Integer, ForeignKey('items.id'), primary_key=True) 
    name = Column(String(20), primary_key=True) 
    value = Column(String(100)) 

    def __init__(self, name, value): 
     self.name = name 
     self.value = value   

class Item(Base): 
    __tablename__ = 'items' 
    id = Column(Integer, primary_key=True) 
    name = Column(String(20)) 
    description = Column(String(100)) 
    _notesdict = relation(Note, 
          collection_class=column_mapped_collection(Note.name)) 
    notes = association_proxy('_notesdict', 'value', creator=Note) 

    def __init__(self, name, description=''): 
     self.name = name 
     self.description = description 

Base.metadata.create_all() 

Ahora vamos a hacer una prueba:

Session = sessionmaker(bind=engine) 
s = Session() 

i = Item('ball', 'A round full ball') 
i.notes['color'] = 'orange' 
i.notes['size'] = 'big' 
i.notes['data'] = 'none' 

s.add(i) 
s.commit() 
print i.notes 

me sale:

{u'color': u'orange', u'data': u'none', u'size': u'big'} 

Ahora vamos compruebe la tabla de notas ...

for note in s.query(Note): 
    print note.id_item, note.name, note.value 

me sale:

1 color orange 
1 data none 
1 size big 

Funciona !! : D

+0

gracias @nosklo! –

+0

Estoy obteniendo un 'sqlalchemy.exceptions.NoReferencedTableError: No se pudo encontrar la tabla 'items' con los cuales generar una clave foránea' –

+0

¡Lo arreglé! Tuve que eliminar 'ForeignKey ('items.id')' de 'Note.id_item' y agregar' Note .__ table __. Append_constraint (ForeignKeyConstraint (['id_item'], ['items.id'])) 'después de la declaración de 'Artículo'. También tuvo que reemplazar 'Note.name' con' Note .__ table __. C.name' en 'Item._notesdict'. –

Cuestiones relacionadas