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.

Reply via email to