I am trying to access an objects primary key either in the constructor
(preferred) or right after the object is created. And I would like to
use a scoped session for this. Below is some dummy code to illustrate
what I'm trying to do.

I defined the get_person function to first query the database to see
if the object already exists. If not it creates a new object.

As is, the code will print 2 lines with in both cases 'None' as id.

My question is, is there a way to make SA flush this object to the
database as soon as possible? Making the session autoflush=True does
not help.

It does work if I enable the Session.object_session(self).flush() line
in the constructor or in the get_person function, but this doesn't
seem like a clean way to do it, especially not in the constructor. Is
this the correct way to do it or does SA provide another, cleaner way?
I would have expected autoflush to do this.

(I can't do session.flush() since in reality session is not in the
scope of either Person.__init__() or get_person(), they are both
defined in my module's __init__.py while session is initialized in the
script that imports the module.)

Many thanks,

Jan.

### demo code:
######
from sqlalchemy import *
from sqlalchemy.orm import *

# Define SQLite databases
person_engine  = create_engine('sqlite:///person_db.sqlite')

# Define database structure
metadata=MetaData()
metadata.bind = person_engine

person_table = Table(
    'person', metadata,
    Column('id', Integer, primary_key=True),
    Column('name', Text),
)

person_table.create()

Session = scoped_session(sessionmaker())
#Session = scoped_session(sessionmaker(autoflush=True))
session = Session()

class Person(object):
    def __init__(self, name):
        self.name = name
#        Session.object_session(self).flush()
        print "In constructor: id=%s"%self.id

person_mapper = Session.mapper(Person, person_table)

def get_person(name):
    result = Person.query().filter_by(name=name).first()
    if not result:
        result = Person(name)
#        Session.object_session(result).flush()
        print "New person made: id=%s, name=%s"%(result.id,
result.name)
    return result

p = get_person("Ed Jones")

session.commit()
session.close()

--~--~---------~--~----~------------~-------~--~----~
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 
sqlalchemy+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to