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 [email protected].
To post to this group, send email to [email protected].
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.