Hi,

I'm using sqla with the following schema (see below). I'm creating a cell 
object implicitly, using the function make_cell and the association proxy 
pattern.

def make_cell(patient_obj, snp_obj, snpval):
     patient_obj.snps[snp_obj] = snpval
     return patient_obj

My question is, is there some way to get my hands on the Cell object that 
was just created? If possible, I'd like make_cell to return the cell 
object. My immediate reason is that this would make it easy to save the 
object using session.save() (there might be some indirect way to do this, 
of course), but it would be nice anyway.

Thanks in advance. Please CC me on any reply.
                                                          Regards, Faheem.

******************************************************************
dbschema.py
******************************************************************
from sqlalchemy import *
from sqlalchemy.orm import *
from sqlalchemy.ext.associationproxy import association_proxy
from sqlalchemy.orm.collections import attribute_mapped_collection
from datetime import datetime

metadata = MetaData('sqlite:///btsnp.sqlite')

# *patients*
# patient_id (PK)
# (Can use actual patient id as unique/alternate identifier
# Create index).
# sex -> list of choices allowed
# age -> (0, 140)
# time of death

patient_table = Table(
     'patient', metadata,
     Column('id', String(20), primary_key=True, index=True),
     Column('celfilename', String(30), nullable=False, index=True, unique=True),
     Column('sex', String(1)),
     )

cell_table = Table(
     'cell', metadata,
     Column('patient_id',  None, ForeignKey('patient.id', onupdate='CASCADE', 
ondelete='CASCADE'), index=True, nullable=False, primary_key=True),
     Column('snp_id', None, ForeignKey('snp.rsid', onupdate='CASCADE', 
ondelete='CASCADE'),  index=True, nullable=False, primary_key=True),
     Column('snpval_id', None, ForeignKey('snpval.val', onupdate='CASCADE', 
ondelete='CASCADE'), index=True, nullable=False)
     )

# *snps*
# snp_id (PK)
# name (name of snp)

snp_table = Table(
     'snp', metadata,
     Column('rsid', String(20), nullable=False, primary_key=True),
     Column('chromosome', Integer, nullable=False),
     Column('location', Integer, nullable=False),
     Column('probe_set_id', String(20), nullable=False, unique=True),
     Column('allele', String(3), nullable=False),
     )

# *doublets*
# doublet_id (PK)
# seq (two letters AA, AG)

snpval_table = Table(
     'snpval', metadata,
     Column('val', Integer, primary_key=True),
     )

metadata.create_all()

def create_cell(snp, snpval):
     return Cell(snp=snp, snpval=snpval)

class Patient(object):
     def __init__(self, id, celfilename, sex):
         self.id = id
         self.celfilename = celfilename
         self.sex = sex
     def __repr__(self):
         return '<Patient %s>'%self.id
     snps = association_proxy('by_rsid', 'snpval', creator=create_cell)

class Cell(object):
     def __init__(self, patient=None, snp=None, snpval=None):
         self.patient = patient
         self.snp = snp
         self.snpval = snpval
     def __repr__(self):
         return '<Cell %s>'%self.snpval

class Snp(object):
     def __init__(self, rsid, chromosome, location, probe_set_id, allele):
         self.rsid = rsid
         self.chromosome = chromosome
         self.location = location
         self.probe_set_id = probe_set_id
         self.allele = allele
     def __repr__(self):
         return '<SNP %s>'%self.rsid
     patients = association_proxy('by_patient', 'snpval', creator=create_cell)

class Snpval(object):
     def __init__(self, val):
         self.val = val
     def __repr__(self):
         return '<Snpval %s>'%self.val

# mapper(Broker, brokers_table, properties={
#     'by_stock': relation(Holding,
#         collection_class=attribute_mapped_collection('stock'))
# })

# 'cells' corresponds to a 1 to many relation.
mapper(Patient, patient_table, properties={'cells':relation(Cell, 
backref='patient'),
                                            'by_rsid': relation(Cell, 
collection_class=attribute_mapped_collection('snp'))}
                                            )
# 'patient_snpval' corresponds to a many to 1 relation.
# 'patient_snpval' corresponds to a 1 to 1 relation.
mapper(Cell, cell_table, properties={'snp':relation(Snp, backref='cells'),
                                      'snpval':cell_table.c.snpval_id,
                                      'snpval_obj':relation(Snpval, 
uselist=False, backref='cell')})
mapper(Snp, snp_table, properties={'by_patient': relation(Cell, 
collection_class=attribute_mapped_collection('patient'))})
mapper(Snpval, snpval_table)

#print patient_mapper.identity_key_from_instance()

# 0) Create doublet (2 letters).
# 1) Enter row names (cols) and patient names( snp ids).
# 2) Look at text files and update linker tables.

**************************************************************************

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to sqlalchemy@googlegroups.com
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
-~----------~----~----~----~------~----~------~--~---

Reply via email to