321
321
del obj_info["store"]
323
323
elif pending is PENDING_ADD:
327
for column in cls_info.columns:
328
variable = obj_info.variables[column]
329
if variable.is_defined():
330
columns.append(column)
331
variables.append(variable)
333
lazy_value = variable.get_lazy()
334
if isinstance(lazy_value, Expr):
335
columns.append(column)
336
variables.append(lazy_value)
338
expr = Insert(columns, variables, cls_info.table)
325
# Give a chance to the backend to process primary variables.
326
self._connection.preset_primary_key(cls_info.primary_key,
327
obj_info.primary_vars)
329
changes = self._get_changes_map(obj_info, True)
331
expr = Insert(changes, cls_info.table,
332
primary_columns=cls_info.primary_key,
333
primary_variables=obj_info.primary_vars)
340
335
result = self._connection.execute(expr)
356
351
cached_primary_vars = obj_info["primary_vars"]
357
352
primary_key_idx = cls_info.primary_key_idx
360
for column in cls_info.columns:
361
variable = obj_info.variables[column]
362
if variable.has_changed():
363
if variable.is_defined():
364
changes[column] = variable
366
lazy_value = variable.get_lazy()
367
if isinstance(lazy_value, Expr):
368
changes[column] = lazy_value
354
changes = self._get_changes_map(obj_info)
371
357
expr = Update(changes,
387
373
obj_info.event.emit("flushed")
375
def _get_changes_map(self, obj_info, adding=False):
376
"""Return a {column: variable} dictionary suitable for inserts/updates.
378
@param obj_info: ObjectInfo to inspect for changes.
379
@param adding: If true, any defined variables will be considered
380
a change and included in the returned map.
382
cls_info = obj_info.cls_info
384
select_variables = []
385
for column in cls_info.columns:
386
variable = obj_info.variables[column]
387
if adding or variable.has_changed():
388
if variable.is_defined():
389
changes[column] = variable
391
lazy_value = variable.get_lazy()
392
if isinstance(lazy_value, Expr):
393
if id(column) in cls_info.primary_key_idx:
394
select_variables.append(variable) # See below.
395
changes[column] = variable
397
changes[column] = lazy_value
399
# If we have any expressions in the primary variables, we
400
# have to resolve them now so that we have the identity of
401
# the inserted object available later.
403
resolve_expr = Select([variable.get_lazy()
404
for variable in select_variables])
405
result = self._connection.execute(resolve_expr)
406
for variable, value in zip(select_variables, result.get_one()):
407
result.set_variable(variable, value)
389
411
def _fill_missing_values(self, obj_info, primary_vars, result=None,
390
412
checkpoint=True, replace_lazy=False):
391
413
"""Query retrieve from the database any missing values in obj_info.