In my code, I am currently adding to the "session" in various modules
(this is the same session since I'm importing it from my most
prominent module).
Some sample code would be:
###### BEGIN CODE 1 #######
Session = sessionmaker(bind=engine)
session = Session()
def addToTable():
"""Very simple SQLAlchemy function that populates the Student,
Project
and Supervisor tables."""
for student in students.itervalues():
session.add(student)
session.flush()
for project in projects.itervalues():
session.add(project)
session.flush()
for supervisor in supervisors.itervalues():
session.add(supervisor)
session.flush()
session.commit()
And then again in a function in the same module:
def monteCarloBasic(trials):
"""The Monte-Carlo simulation will generate allocations for the
list of students by randomly arranging the order for each trial.
In the case of a student having more than one project for a given
rank,
the algorithm with randomly select one of them since it is given that
all such projects are equally desireable to the student."""
session_id = 1
ident = 1
for trial in xrange(trials):
for id in randomiseStudentKeys(True):
stud_id = id
student = students[id]
if student.preferences:
temp_alloc = SimAllocation(ident, session_id,
stud_id)
ranks = sorted(student.preferences.keys())
for rank in ranks:
# Now we begin to try giving him/her a project
proj =
random.choice(list(student.preferences[rank]))
if not (proj.allocated or proj.blocked
or proj.own_project):
student.allocated_project = proj
student.allocated_proj_ref =
proj.proj_id
student.allocated_rank = rank
allocSuccessActions(proj)
temp_alloc.alloc_proj =
proj.proj_id # ... we can set the
allocated project details
temp_alloc.alloc_proj_rank =
rank
session.add(temp_alloc)
break
ident += 1 # Increment the primary key
session.add(temp_alloc)
session.flush()
session_id += 1
resetData() # Resets all data
session.commit()
####### END CODE 1 #######
Later on I'm using this session to run some calculations on my data.
For example:
####### BEGIN CODE 2 ########
sid = 4545
project_id_list = list(students[sid].preferences)
for project_id in project_id_list
gotcha =
session.query(SimAllocation).filter(SimAllocation.student_id ==
sid).filter(PP.SimAllocation.alloc_proj == project_id).count()
###### END CODE 2 #######
Simply, this line counts how many times a certain student was
allocated each project from his list when using the Monte-Carlo
simulation from ### CODE 1 ### above.
+++ Questions +++
1. Is this the correct way to use sessions or am I sort of abusing
them?
2. When should I close a session?
3. I got the following error after trying to use copy.deepcopy() on
one of my dictionaries.
File "Main.py", line 106, in <module>
OPTM.preoptAlloc(some_best)
File "XXXXXXXX/Optimisation.py", line 48, in preoptAlloc
sid = projs_preopt[sim.alloc_proj_ref].proj_sup
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/
lib/python2.6/site-packages/SQLAlchemy-0.5.8-py2.6.egg/sqlalchemy/orm/
attributes.py", line 158, in __get__
return self.impl.get(instance_state(instance),
instance_dict(instance))
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/
lib/python2.6/site-packages/SQLAlchemy-0.5.8-py2.6.egg/sqlalchemy/orm/
attributes.py", line 377, in get
value = callable_()
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/
lib/python2.6/site-packages/SQLAlchemy-0.5.8-py2.6.egg/sqlalchemy/orm/
state.py", line 185, in __call__
attr.impl.key in unmodified
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/
lib/python2.6/site-packages/SQLAlchemy-0.5.8-py2.6.egg/sqlalchemy/orm/
mapper.py", line 1864, in _load_scalar_attributes
"attribute refresh operation cannot proceed" % (state_str(state)))
sqlalchemy.exc.UnboundExecutionError: Instance <Project at 0x24c5c50>
is not bound to a Session; attribute refresh operation cannot proceed
Is this something to do with the way I've been using the sessions?
---
Thanks,
Az
--
You received this message because you are subscribed to the Google Groups
"sqlalchemy" group.
To post to this group, send email to [email protected].
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.