Hi, I'm new to SQLAlchemy/ORMs - previously I had just been interacting directly with the builtin SQLite driver and had built up my own mess of a mapping system.
1) I'm starting to convert some classes in a Python package to SQLAlchemy models. . A paired down example of what I'm doing: class Gene: def __init__(self, identifiers, features): self.identifiers = identifiers self.features = features gene = Gene(identifiers={'locus': 'GENE_0001', 'protein_id': 'PROT_0001'}, features={'mRNA': '1..300,400..500', 'CDS': '1..300,400..500'}) In reality, I'm dealing with many attributes that are all related to the Gene and stored in the same table, which is why to simplify the interface of my classes, I grouped related instance attributes in dictionaries. For example, the location of the mRNA feature of this Gene can then be accessed by gene.features['mRNA']. Each value in the dictionary refers to a unique database column. However, when creating SQLAlchemy models, it's required to explicitly map Columns directly as class attributes, e.g.: class Gene: id = Column(Integer, primary_key=True) locus = Column(String) protein_id = Column(String) mRNA = Column(String) CDS = Column(String) Is there a simple way to provide the dictionary functionality? Something like: class Gene: id = Column(Integer, primary_key=True) identifiers = { 'locus': Column(String), 'protein': Column(String) } ... Where a change in Gene.identifiers['locus'] would then result in an update to the 'locus' column. I saw MutableDict in the documentation but it seems non-trivial to implement for something like this. Is this even a good idea? 2) Say for the example above I have created a plain Python Location class to represent a location of a feature in self.features: class Location: def __init__(self, intervals, ...): self.intervals = intervals ... @classmethod def from_flat(cls, flat): # convert flat location to list of tuples # e.g. [(1, 300), (400, 500)] This class has a classmethod that takes the stored flat string (e.g. 1..300,400..500) and converts it to a list of interval tuples, and has some extra logic in it for use in my applications. I understand I can use orm.reconstructor to instantiate these Location objects from the stored attributes upon object loading, i.e. @reconstructor def init_on_load(self): self.mRNA = Location.from_flat(self.mRNA) ... However, what I don't get is how I should be shuttling changes in these objects back to the database as updates. Is there some way to map this (instantiate Location on loading; mutate Location; convert Location back to flat format to update the Gene attribute)? Do i need to write setter methods for each that directly set the underlying column attribute to the flat representation of the Location? Any help is appreciated, cheers -- SQLAlchemy - The Python SQL Toolkit and Object Relational Mapper http://www.sqlalchemy.org/ To post example code, please provide an MCVE: Minimal, Complete, and Verifiable Example. See http://stackoverflow.com/help/mcve for a full description. --- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To unsubscribe from this group and stop receiving emails from it, send an email to sqlalchemy+unsubscr...@googlegroups.com. To post to this group, send email to sqlalchemy@googlegroups.com. Visit this group at https://groups.google.com/group/sqlalchemy. To view this discussion on the web visit https://groups.google.com/d/msgid/sqlalchemy/f3105bee-b6dc-489c-82e0-c6d36710a462%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.