summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/orm/persistence.py
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2014-08-18 16:44:07 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2014-08-18 16:44:07 -0400
commit4ade138769a74ee2beda184e89d89238426d3741 (patch)
tree66a7aa110223dd804971996027c753a18f505002 /lib/sqlalchemy/orm/persistence.py
parent06dec268e53e999bd348ef2ca148def066ca30d6 (diff)
downloadsqlalchemy-4ade138769a74ee2beda184e89d89238426d3741.tar.gz
- further reorganize collect_insert_commands to distinguish between
setting up given values vs. defaults. again trying to shoot for making this of more general use
Diffstat (limited to 'lib/sqlalchemy/orm/persistence.py')
-rw-r--r--lib/sqlalchemy/orm/persistence.py34
1 files changed, 21 insertions, 13 deletions
diff --git a/lib/sqlalchemy/orm/persistence.py b/lib/sqlalchemy/orm/persistence.py
index c7850ac1d..f17b1d79c 100644
--- a/lib/sqlalchemy/orm/persistence.py
+++ b/lib/sqlalchemy/orm/persistence.py
@@ -253,20 +253,28 @@ def _collect_insert_commands(table, states_to_insert):
params = {}
value_params = {}
- for col, propkey in mapper._col_to_propkey[table]:
- if propkey in state_dict:
- value = state_dict[propkey]
- if isinstance(value, sql.ClauseElement):
- value_params[col.key] = value
- elif value is not None or (
- not col.primary_key and
- not col.server_default and
- not col.default):
- params[col.key] = value
+
+ propkey_to_col = mapper._propkey_to_col[table]
+
+ for propkey in set(propkey_to_col).intersection(state_dict):
+ value = state_dict[propkey]
+ col = propkey_to_col[propkey]
+ if value is None:
+ continue
+ elif isinstance(value, sql.ClauseElement):
+ value_params[col.key] = value
else:
- if not col.server_default \
- and not col.default and not col.primary_key:
- params[col.key] = None
+ params[col.key] = value
+
+ for colkey in (
+ set(
+ col.key for col in
+ mapper._cols_by_table[table]
+ if not col.primary_key and
+ not col.server_default and not col.default
+ ).difference(params).difference(value_params)
+ ):
+ params[colkey] = None
has_all_pks = mapper._pk_keys_by_table[table].issubset(params)