zmc
2023-08-08 e792e9a60d958b93aef96050644f369feb25d61b
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
U
¸ý°d8ñã@s¨dZddlmZddlmZddlmZddlmZddlZddlm    Z    dd    lm
Z dd
lm Z dd lm Z dd lmZd d    lm
Zd dlmZd dlmZd dlmZd dlmZd dlmZd dlmZd dlmZdDdd„Zdd„Zdd„Zdd„Zdd„Z d d!„Z!dddd"d#œd$d%„Z"ddd"d&œd'd(„Z#d)d*„Z$d+d,„Z%d-dd-d.œd/d0„Z&d-ddd1œd2d3„Z'd4d5„Z(d6d7„Z)d8d9„Z*d:d;„Z+d<d=„Z,d>d?„Z-d@dA„Z.dBdC„Z/dS)Ezëprivate module containing functions used to emit INSERT, UPDATE
and DELETE statements on behalf of a :class:`_orm.Mapper` and its descending
mappers.
 
The functions here are called only by the unit of work functions
in unitofwork.py.
 
é)Ú annotations)Úchain)Úgroupby)Ú zip_longestNé)Ú
attributes)Úexc)Úloading)Úsync)Ú    state_stré)Úfuture)Úsql)Úutil)Úcursor)Ú    operators)ÚBooleanClauseList)ÚLABEL_STYLE_TABLENAME_PLUS_COLFcCs|s0|js0t||ƒD]}t||g|ddqdSg}g}t|||ƒD]B\}}}}    }
} } |
s^| rt| ||||    | f¡qD| ||||    f¡qD|j ¡D]J\} }| |jkr¦q’t| |ƒ}t    || |ƒ}t
|||| |ƒt |||| |ƒq’t ||t dd„|Dƒdd„|DƒƒƒdS)a;Issue ``INSERT`` and/or ``UPDATE`` statements for a list
    of objects.
 
    This is called within the context of a UOWTransaction during a
    flush operation, given a list of states to be flushed.  The
    base mapper in an inheritance hierarchy handles the inserts/
    updates for all descendant mappers.
 
    T)ÚsingleNcss$|]\}}}}||||dfVqdS)FN©)Ú.0ÚstateÚ
state_dictÚmapperÚ
connectionrrúQd:\z\workplace\vscode\pyvenv\venv\Lib\site-packages\sqlalchemy/orm/persistence.pyÚ    <genexpr>is
ÿzsave_obj.<locals>.<genexpr>css&|]\}}}}}||||dfVqdS)TNr)rrrrrÚupdate_version_idrrrrmsú)ÚbatchÚ _sort_statesÚsave_objÚ_organize_states_for_saveÚappendÚ_sorted_tablesÚitemsÚ _pks_by_tableÚ_collect_insert_commandsÚ_collect_update_commandsÚ_emit_update_statementsÚ_emit_insert_statementsÚ _finalize_insert_update_commandsr)Ú base_mapperÚstatesÚuowtransactionrrÚstates_to_updateÚstates_to_insertÚdict_rrÚ has_identityÚ
row_switchrÚtableÚinsertÚupdaterrrr (sn
 
 
ø ÿ
 
ÿûûþøûýr cshtt|||ƒƒ}|j ¡D]H\‰‰ˆˆjkr.q‡‡fdd„|Dƒ}t||ˆ||ƒ}t||ˆˆ|ƒqdS)z\Issue UPDATE statements on behalf of a relationship() which
    specifies post_update.
 
    c
3sH|]@\}}}}ˆ|jkr||||ˆjdk    r:ˆ ||ˆj¡ndfVqdS©N)r%Úversion_id_colÚ#_get_committed_state_attr_by_column)rrrZ
sub_mapperr©rr3rrr‰s
 
õýÿ÷zpost_update.<locals>.<genexpr>N)ÚlistÚ _organize_states_for_post_updater#r$r%Ú_collect_post_update_commandsÚ_emit_post_update_statements)r+r,r-Úpost_update_colsr.r5rr9rÚ post_update{s.
ÿ
 ôÿûr?c Cs–tt|||ƒƒ}|j}tt| ¡ƒƒD]F}||}||jkr@q&n|jrN|jrNq&t||||ƒ}t    |||||ƒq&|D]\}}    }}
} |j
  ||
|¡qrdS)z‘Issue ``DELETE`` statements for a list of objects.
 
    This is called within the context of a UOWTransaction during a
    flush operation.
 
    N) r:Ú_organize_states_for_deleter#ÚreversedÚkeysr%ZinheritsZpassive_deletesÚ_collect_delete_commandsÚ_emit_delete_statementsÚdispatchZ after_delete) r+r,r-Ústates_to_deleteZtable_to_mapperr3rÚdeleterrrrrrrÚ
delete_obj¦s>
ÿ
 ÿûúrHc csJt|||ƒD]6\}}}}t|jƒ}|jp2| |¡}d}    }
|sR|j |||¡n|j |||¡|jrv| |||¡|sô||jj    krô|jj    |} t
  | ¡} |  | ¡sô|  | ¡sÎt dt|ƒ|t| ƒf¡n&| d|t|ƒt| ƒ¡| | ¡| }    |sþ|    r0|jdk    r0| |    r|    n||    r&|    jn||j¡}
||||||    |
fVq dS)aTMake an initial pass across a set of states for INSERT or
    UPDATE.
 
    This includes splitting out into distinct lists for
    each, calling before_insert/before_update, obtaining
    key information for each state including its dictionary,
    mapper, the connection to use for the execution per state,
    and the identity flag.
 
    NzJNew instance %s with identity key %s conflicts with persistent instance %szPdetected row switch for identity %s.  will update %s, remove %s from transaction)Ú_connections_for_statesÚboolÚkeyÚ_identity_key_from_staterEZ before_insertZ before_updateZ_validate_polymorphic_identityÚsessionZ identity_maprZinstance_stateZwas_already_deletedÚ
is_deletedrÚwarnr Z
_log_debugZremove_state_actionsr7r8Údict) r+r,r-rr0rrr1Z instance_keyr2rÚinstanceÚexistingrrrr!Ñs` ÿ
ÿ
þ 
 
 
þÿú
 
 ýùr!cCs t|||ƒS)z÷Make an initial pass across a set of states for UPDATE
    corresponding to post_update.
 
    This includes obtaining key information for each state
    including its dictionary, mapper, the connection to use for
    the execution per state.
 
    )rI)r+r,r-rrrr;"s    r;ccs^t|||ƒD]L\}}}}|j |||¡|jdk    rD| |||j¡}nd}|||||fVq dS)zôMake an initial pass across a set of states for DELETE.
 
    This includes calling out before_delete and obtaining
    key information for each state including its dictionary,
    mapper, the connection to use for the execution per state.
 
    N)rIrEZ before_deleter7r8)r+r,r-rr0rrrrrrr@.sÿ
ÿr@r)ÚbulkÚreturn_defaultsÚ render_nullsÚinclude_bulk_keysc    #sÈ|D]¼\}‰}}||jkrqi}    i}
|j|} |j|} t| ƒ ˆ¡D]l} ˆ| }| | }|dkrt|| krt|stqHqH|sªt|dƒsŽt|tjƒrªt|dƒr |     ¡n||
|<qH||    |j
<qH|sè|j |  |    ¡  dd„|
Dƒ¡D] }d|    |<qÚ|rò|r,|j | |    ¡}|j |j|¡r&|j| |    ¡}nd}nd}}|jdk    rp|jdk    rp|j|j|krp| d¡|    |jj
<|r¬|jrŽ|     |j|j¡|r¬|     ‡fdd„|Dƒ¡|ˆ|    |||
||fVqdS)    zSIdentify sets of values to use in INSERT statements for a
    list of states.
 
    NÚ__clause_element__cSsg|]
}|j‘qSr©rK©rÚcrrrÚ
<listcomp>ysz,_collect_insert_commands.<locals>.<listcomp>TFc3s|]}|ˆ|fVqdSr6r©rÚk©rrrrsz+_collect_insert_commands.<locals>.<genexpr>)r%Ú_propkey_to_colZ_insert_cols_evaluating_noneÚsetÚ intersectionÚhasattrÚ
isinstancerÚ ClauseElementrWrKZ_insert_cols_as_noneÚ
differenceZ_pk_keys_by_tableÚissubsetr+Ú_prefer_eager_defaultsÚdialectZ_server_default_col_keysÚversion_id_generatorr7Ú_cols_by_tableZ_set_polymorphic_identityÚ
setdefaultZ_polymorphic_attr_keyZpolymorphic_identityr5)r3r/rSrTrUrVrrrÚparamsÚ value_paramsÚpropkey_to_colZ    eval_noneÚpropkeyÚvalueÚcolZcolkeyÚ has_all_pksÚhas_all_defaultsrr^rr&FsŠ 
 
 
ÿ
þÿ
ý 
ÿ þÿ
 
ÿÿþÿþýÿ ÿør&)rSÚuse_orm_update_stmtrVc #s|D]„\}‰}}}    ||jkr q|j|}
|dk    r:|j} ni} |j|‰|r|‡‡fdd„tˆƒ ˆ¡ |j|¡Dƒ} d} n¨i} tˆƒ |j¡D]n}ˆ|}ˆ|}t|dƒsºt    |t
j ƒrÖt|dƒrÌ|  ¡n|| |<q|j |j ||j|¡dk    r|| |j<q|jjdkr |j| | ¡} nd} |    dk    rþ|j|j|krþ|sŽ| sŽ| sŽ|j ¡D].}|j |jj |ˆtj¡}|jr\qސq\q|j}| o | }|    | |j<|s¾|j| krà|jdk    rà| |    ¡}|| |j<n|jdkr |r |    | |j<n| s | s qd}d}|r@‡‡fdd„tˆƒ |j|¡Dƒ}nÌi}|
D]Â}|j|j}|j |j |ˆtj¡}|jrÖ|j r’d||f|jkr¶d}|jd    ||j<|  !|jd¡n|j d    ||j<|| kræd}n|j"d    ||j<||jdkrHt# $d
||f¡‚qH|r*|  %‡fd d „|Dƒ¡| s6| rX|  %|¡|ˆ| ||| | |fVq|r|j&|D]"\}}t' (|||||||j)¡qfqdS) atIdentify sets of values to use in UPDATE statements for a
    list of states.
 
    This function works intricately with the history system
    to determine exactly what values should be updated
    as well as how the row should be matched within an UPDATE
    statement.  Includes some tricky scenarios where the primary
    key of an object might have been changed.
 
    Ncsi|]}ˆ|jˆ|“qSrrX©rro©rnrrrÚ
<dictcomp>×sÿz,_collect_update_commands.<locals>.<dictcomp>TrWFcsi|]}ˆ|jˆ |¡“qSr)Ú_labelÚgetrurvrrrw+sÿZ pk_cascadedrzCCan't update table %s using NULL for primary key value on column %sc3s|]}|ˆ|fVqdSr6rr\r^rrrQsz+_collect_update_commands.<locals>.<genexpr>)*r%Z_valuesr_r`rareZ_pk_attr_keys_by_tableZcommitted_staterbrcrrdrWÚmanagerÚimplZis_equalrKr+Úeager_defaultsZ!_server_onupdate_default_col_keysrfr7rjÚ_columntopropertyÚvaluesÚ get_historyrÚPASSIVE_NO_INITIALIZEÚaddedrxriÚ PASSIVE_OFFZdeletedÚpopZ    unchangedÚorm_excÚ
FlushErrorr5Ú_table_to_equatedr
ÚpopulateÚpassive_updates)r-r3r.rSrtrVrrrrÚpksrmrlrsrorprqÚpropÚhistoryZ    no_paramsÚvalrrZexpect_pk_cascadedZ    pk_paramsÚmÚ equated_pairsrrvrr'«sú
 
 
 ÿþþÿ ÿÿ
ý ÿýÿ ÿþÿþÿ
 
ÿÿþ
    ÿþ  ÿÿÿþ
ÿÿ 
ø
ùr'ccs,|D] \}}}}}    |j|}
i} d} |j|D]|} | |
krX|j||| tjd| | j<q0| |ksj| jdk    r0|j| }|j|j    j
  ||tj ¡}|j r0|j d}|| | j    <d} q0| r|    dk    r|j|j|kr|j} |    | | j<t|j    ƒr| j    | kr|jdk    r| |    ¡}|| | j    <||||| fVqdS)zrIdentify sets of values to use in UPDATE statements for a
    list of states within a post_update operation.
 
    F)ZpassiveNrT)r%rjZ_get_state_attr_by_columnrr‚rxZonupdater}rzrKr{rr€rr7rJri)r+r-r3r.r>rrrrrr‰rlZhasdatarqrŠr‹rprŒrrrr<qsZú
ÿ
ÿ
 
ÿþ
ÿþý
 
r<c cs˜|D]Ž\}}}}}||jkrqi}    |j|D]6}
| |||
¡|    |
j<} | dkr,t d||
f¡‚q,|dk    rˆ|j|j|krˆ||    |jj<|    |fVqdS)zSIdentify values to use in DELETE statements for a list of
    states to be deleted.NzHCan't delete from table %s using NULL for primary key value on column %s)r%r8rKr„r…r7rj) r+r-r3rFrrrrrrlrqrprrrrC©s@ ú
ÿþÿþÿÿþ rCT)Ú bookkeepingrtÚenable_check_rowcountc sˆjdk    oˆjˆjˆk‰d|ji}d‡‡‡fdd„    }    |dk    rH|    |ƒ}
n| dˆf|    ¡}
t|dd„ƒD]”\\} } } }}}d}t|ƒ}|
}|dk    r¢| ˆˆd    œ¡}d
}|s¾|jˆjˆŽ}d }|rô|sôˆj    j
d krôˆj rô| j j rô|jˆjˆŽ}d }ˆjr | ˆj¡}d }| j j}|o | j j}| o.ˆ }| rª|D]j\}}}‰} }}}| j| |¡||d }|rŽtˆ|ˆ||||jjd|d |jƒ
||j7}|o |}q:n |s|o¸|}|D]Z\}}}‰} }}}| j|||d }|r tˆ|ˆ||||jjd|d |jƒ
||j7}q¾nšd d„|Dƒ}|oF|pF|oFt|ƒdk}| j|||d }||j7}|D]N\}}}‰} }}}|rftˆ|ˆ||||jjd|d |jjs¬|jndƒ
qf|ræ|t|ƒkrüt dˆjt|ƒ|f¡‚qfˆrft d|j j ¡qfdS)z`Emit UPDATE statements corresponding to value lists collected
    by _collect_update_commands().NÚcompiled_cachecs„t tj¡}ˆjˆD] }| |tj|j|j    dk¡qˆr^| ˆj
tjˆj
jˆj
j    dk¡|dk    rr|  |¡}nˆ  ¡  |¡}|S©N)Útype_) rÚ_construct_rawrÚand_r%Ú_append_inplacerÚ    bindparamrxÚtyper7Úwherer5)Z existing_stmtÚclausesrqÚstmt©rZneeds_version_idr3rrÚ update_stmtås$ ÿþÿÿ z,_emit_update_statements.<locals>.update_stmtr5cSs*|dt|dƒt|dƒ|d|dfS©Nér ééé©r`rJ©ÚrecrrrÚ<lambda>s 
 
ûz)_emit_update_statements.<locals>.<lambda>r)Z_emit_update_tableZ_emit_update_mapperFT©Úexecution_optionscSsg|] }|d‘qS©r r©rr¥rrrr[sz+_emit_update_statements.<locals>.<listcomp>rúMUPDATE statement on table '%s' expected to update %d row(s); %d were matched.úMDialect %s does not support updated rowcount - versioning cannot be verified.)N)!r7rjÚ_compiled_cacheÚ_memorr:Ú    _annotaterTr%r+r|Úimplicit_returningrhZupdate_returningZ_server_onupdate_default_colsÚ!_version_id_has_server_side_valueÚsupports_sane_rowcountÚsupports_sane_multi_rowcountÚexecuter~Ú
_postfetchÚcontextÚcompiled_parametersÚreturned_defaultsÚrowcountÚlenÚ executemanyr„ÚStaleDataErrorÚ descriptionrrOÚdialect_description)r+r-rr3r5rrtrr¨rÚ cached_stmtrZ    paramkeysÚhasvaluersrrÚrecordsÚrowsÚ    statementrTÚassert_singlerowÚassert_multirowÚallow_executemanyrrrlrmrZÚcheck_rowcountÚ multiparamsrrœrr(ÐsB
þ
 
þý  þÿÿþ
ýùø
ÿ þ
÷ý
ö
 
 
÷ÿ
ö þÿ
÷
ÿ
ôþÿþÿr()rÚuse_orm_insert_stmtr¨c% Cs°|dk    r,|}tj}    t|jƒ}
|
r&|jp(|} n$d}
|} | d|f|j¡}d|ji}    |rdtj |    |¡}n|    }d} t    |dd„ƒD]\\} }}}}}|}|dk    rª| 
||dœ¡}|rÐ|sÐ|  | j |¡rÐ|j rÐ| j jsx|
sx|rx|sxt|ƒ}dd    „|Dƒ}| j|||d
}|rŠt||jjƒD]X\\}}}}}}}}}|rft||||||||d|jjs^|jndƒ
n t|||ƒqqzt|ƒ}|
sš|sút|ƒd krú| rª| j jsº| sÀ| j jrÀd }n8|
rô| rÒd }nd}t d| j j›d|›d¡‚nd}nd}|dkr4|s4|  | j |¡r4|j|j|d|iŽ}|j dk    rR|j|j |d}n|rj|j|j!d|iŽ}|r~dd    „|Dƒ}| j|||d
}|dk    r²| dkr¨|} n
|  "|¡} |rŠt#||jj|j$|j%pÐdƒD]¦\\}}}}}}}}}}} |dkrt& 'd|¡‚t||j(|ƒD]0\}!}"|j)|"}#| *|#j+¡dkr|!||#j+<q|rlt||||||||d| ƒ
n t|||ƒqÔqz|
rˆt,‚|D]ü\}}}}} }}}|r¾| j| -|¡||d
}n| j|||d
}|j.}$|$dkrît& 'd|f¡‚t|$|j(|ƒD]:\}!}"|j)|"}#|"|ks,| *|#j+¡dkrþ|!||#j+<qþ|rŒ|rzt|||||||jjd|d|jjsr|jndƒ
n t|||ƒqŒqz|dk    r¬| dkr¨t/ 0¡S| SdS)z`Emit INSERT statements corresponding to value lists collected
    by _collect_insert_commands().NFr4r‘cSs*|dt|dƒt|dƒ|d|dfSržr£r¤rrrr¦ås 
 
ûz)_emit_insert_statements.<locals>.<lambda>)Z_emit_insert_tableZ_emit_insert_mappercSsg|] }|d‘qSr©rrªrrrr[sz+_emit_insert_statements.<locals>.<listcomp>r§rTz+ with RETURNING and sort by parameter orderz with RETURNINGz<Can't use explicit RETURNING for bulk INSERT operation with z backend; executemanyz! is not enabled for this dialect.Úsort_by_parameter_order)rÊcSsg|] }|d‘qSr©rrªrrrr[ksrzÈMulti-row INSERT statement for %s did not produce the correct number of INSERTed rows for RETURNING.  Ensure there are no triggers or special driver issues preventing INSERT from functioning properly.z¾Single-row INSERT statement for %s did not produce a new primary key result being invoked.  Ensure there are no triggers or special driver issues preventing INSERT from functioning properly.r)1rÚ
EMPTY_DICTrJZ
_returningZ_sort_by_parameter_orderr®r4r­Z
merge_withrr¯rgrhr°Zinsert_returningr:r´Úzipr¶r·rµr»r¸Ú_postfetch_bulk_saverºZ4insert_executemany_returning_sort_by_parameter_orderZinsert_executemany_returningÚsa_excÚInvalidRequestErrorr¾rTZ_server_default_colsr7Ú primary_keyZsplice_verticallyrZinserted_primary_key_rowsZreturned_defaults_rowsr„r…r%r}ryrKÚAssertionErrorr~Úinserted_primary_keyÚ_cursorZnull_dml_result)%r+r-rr3r4rrÉr¨r¿Zexec_optZreturning_is_required_anywayZdeterministic_results_reqdZ return_resultrÚ_rÀrrrsrÁrÃrÈÚresultrrrlÚ
mapper_recÚconnrmZlast_inserted_paramsZdo_executemanyÚdtrÒr¸ÚpkrqrŠrÐrrrr)¸sþ
þý
ÿþý  þÿ    þüÿûø    ÷ ô óòÿ ôÿ
ôÿ
ÿÿþüûÿ
ÿÿþÿþ þÿÿÿ
 
 
 
üò
ûÿ    þ 
ö 
÷ýý
ûÿÿ 
ÿþ
ÿ
ô
 
r)c s²d|ji}ˆjdk    o"ˆjˆjˆk‰‡‡‡fdd„}| dˆf|¡}ˆjrV| ˆj¡}t|dd„ƒD]F\}}    d}
t|    ƒ}    |d} | jj    } | o”| jj
} ˆ pž| }|sô| }|    D]D\}}}} }| j |||d    }t ||ˆ||||j jdƒ|
|j7}
q¬nrd
d „|    Dƒ}| p| ot|ƒd k}| j |||d    }|
|j7}
|    D],\}}}} }t ||ˆ||||j jdƒq8|r–|
t|    ƒkr¬t d ˆjt|    ƒ|
f¡‚qdˆrdt d|jj¡qddS)zeEmit UPDATE statements corresponding to value lists collected
    by _collect_post_update_commands().r‘Ncspt tj¡}ˆjˆD] }| |tj|j|j    dk¡qˆr^| ˆj
tjˆj
jˆj
j    dk¡ˆ  ¡  |¡}|Sr’) rr”rr•r%r–rr—rxr˜r7r5r™)ršrqr›rœrrrs  ÿþÿÿz1_emit_post_update_statements.<locals>.update_stmtr?cSs|dt|dƒfS)NérŸ)r`r¤rrrr¦'óz._emit_post_update_statements.<locals>.<lambda>rr§cSsg|]\}}}}}|‘qSrr)rrrrÖr×rlrrrr[Hs ÿz0_emit_post_update_statements.<locals>.<listcomp>rr«r¬)r­r7rjr®r±rTrr:rhr²r³r´Ú_postfetch_post_updater¶r·r¹rºr„r¼r½rrOr¾)r+r-rr3r5r¨rrÃrKrÁrÂrrÄrÅrÆrÇrrrÖrlrZrÈrrœrr=ús’
 
þ þþ
ÿ
ù    þÿÿ
 
ù
þÿþÿr=cs`ˆjdk    oˆjˆjˆk‰‡‡‡fdd„}| dˆf|¡}t|dd„ƒD]\}}dd„|Dƒ}    d    |ji}
t|    ƒ} d
} d } ˆrÜ|jjsÜ|jjr¸d } |    D]}|j    |||
d }| |j
7} q–qút   d|jj ¡|j    ||    |
d n|j    ||    |
d }ˆsôd} |j
} |jrH| d
krH| | krH|jjs&t|    ƒdkrH| rDt   dˆj| | f¡qHt dˆj| | f¡‚qHdS)z`Emit DELETE statements corresponding to value lists collected
    by _collect_delete_commands().Ncslt tj¡}ˆjˆD] }| |tj|j|j    dk¡qˆr^| ˆj
tjˆj
jˆj
j    dk¡ˆ  ¡  |¡Sr’) rr”rr•r%r–rr—rKr˜r7rGr™)ršrq©rZneed_version_idr3rrÚ delete_stmt|s ÿÿÿÿz,_emit_delete_statements.<locals>.delete_stmtrGcSs|dS)Nrrr¤rrrr¦rÛz)_emit_delete_statements.<locals>.<lambda>cSsg|] \}}|‘qSrr)rrlrrrrr[sz+_emit_delete_statements.<locals>.<listcomp>r‘éÿÿÿÿFrr§zMDialect %s does not support deleted rowcount - versioning cannot be verified.Trz­DELETE statement on table '%s' expected to delete %d row(s); %d were matched.  Please set confirm_deleted_rows=False within the mapper configuration to prevent this warning.)r7rjr®rr­rºrhr³r²r´r¹rrOr¾Zconfirm_deleted_rowsr½r„r¼)r+r-rr3rGrÞrÃrZrecsZ del_objectsr¨ÚexpectedZ rows_matchedZ    only_warnrlrZrrÝrrDqs~
þ
ÿþÿþÿÿÿÿþýû
ú 
üÿ
üÿrDc
s,|D] \‰}}}}|jrFˆ ‡fdd„|jDƒ¡}|rFˆ ˆj|¡g}|jdkrh| ˆj |j¡¡|j    dk    rš|j
dkrš|j j ˆj krš| |j j g¡|rÒ| ˆ¡ˆ_ t |¡ t¡}    tj|j|    ˆj ˆ|d|sè|j ||ˆ¡n|j ||ˆ¡|j
dkr|j    dk    r||j j dkrt d¡‚qdS)zzfinalize state on states that have been inserted or updated,
    including calling after_insert/after_update events.
 
    csBg|]:}|jr |jr8|jˆjks8|js|js|jˆjkr|j‘qSr)Zexpire_on_flushÚdeferredrKrP)rÚp©rrrr[Þs  ÷z4_finalize_insert_update_commands.<locals>.<listcomp>TNF)Z refresh_stateZonly_load_propsz2Instance does not contain a non-NULL version value)Z_readonly_propsZunmodified_intersectionÚ_expire_attributesrPr|ÚextendZ_unloaded_non_objectraZ&_server_default_plus_onupdate_propkeysr7riZ_version_id_proprKZunloadedrLr ÚselectZset_label_stylerr    Z load_on_identrMrEZ after_insertZ after_updater„r…)
r+r-r,rrrr1ÚreadonlyZ
toload_nowr›rrãrr*ÕsZ
þÿ
ÿÿÿþ 
ÿû    ÿþÿr*c sê| |¡rdS|jjj}|jjj}ˆjdk    rLˆjˆj|krLt|ƒˆjg}tˆj    j
j ƒ}    |    rbg}
|D]D} | j |krf| ˆj krf|| j |ˆj | j <|    rf|
 ˆj | j ¡qf|    rÆ|
rƈj    j
  |||
¡|ræ| |j‡fdd„|Dƒ¡dS)Ncs"g|]}|ˆjkrˆj|j‘qSr©r}rKrY©rrrr[Bs
þz*_postfetch_post_update.<locals>.<listcomp>)rNr¶ÚcompiledÚprefetchÚ    postfetchr7rjr:rJÚ class_managerrEÚ refresh_flushrKr}r"rärP) rr-r3rr0rÕrlÚ prefetch_colsÚpostfetch_colsrîÚload_evt_attrsrZrrérrÜ!s<
 
 
ÿþÿ
þþrÜc
 
sœ|jjj}
|jjj} |jjj‰ˆjdk    rHˆjˆj|krHt|
ƒˆjg}
tˆj    j
j ƒ} | r^g} ˆr¼|    }|dk    r¼t |ˆƒD]B\}}|j r|jjrqxˆj |¡}|rx|||j<| rx|  |j¡qx|
D]D}|j|krÀ|ˆjkrÀ||j|ˆj|j<| rÀ|  ˆj|j¡qÀ| r$| r$ˆj    j
  ||| ¡|rH|rH|  ‡fdd„|Dƒ¡| rj| |j‡fdd„| Dƒ¡ˆj|D]"\}}t ||||||ˆj¡qtdS)z†Expire attributes in need of newly persisted database state,
    after an INSERT or UPDATE statement has proceeded for that
    state.Ncsg|]}|jr|ˆkr|‘qSr)rÐ)rrq)Úreturning_colsrrr[‹sþz_postfetch.<locals>.<listcomp>cs"g|]}|ˆjkrˆj|j‘qSrrèrYrérrr[•s
þ)r¶rêrërìZeffective_returningr7rjr:rJrírErîrÌrÐZisinsertr}ryrKr"rårärPr†r
r‡rˆ)rr-r3rr0rÕrlrmZisupdater¸rïrðrîrñÚrowZ    row_valuerqrŠrZrrŽr)rròrrµJsp
 
 
ÿþ 
 ÿ 
þÿ
þþ ùrµcCs&|j|D]\}}t |||¡q
dSr6)r†r
Zbulk_populate_inherit_keys)rr0r3rrŽrrrrÍ«srÍccs`|jjr|jj}n|j |¡}d}t||ƒD].}|rB||| ¡ƒ}|jj}||j||fVq,dS)zßReturn an iterator of (state, state.dict, mapper, connection).
 
    The states are sorted according to _sort_states, then paired
    with the connection they should be using for the given
    unit of work transaction.
 
    N)    rMÚconnection_callableZ transactionrrÚobjrzrrP)r+r-r,rôrrrrrrrI°s 
 rIc
Cs|t|ƒ}dd„|Dƒ}| |¡zt||jd}Wn2tk
rd}zt d|¡|‚W5d}~XYnXt|t d¡d|S)NcSsh|]}|jdk    r|’qSr6rX)rÚsrrrÚ    <setcomp>Ìs
z_sort_states.<locals>.<setcomp>rXz^Could not sort objects by primary key; primary key values must be sortable in Python (was: %s)Z insert_order)    r`Údifference_updateÚsortedZ_persistent_sortkey_fnÚ    TypeErrorrÎrÏÚoperatorÚ
attrgetter)rr,ÚpendingÚ
persistentZpersistent_sortedÚerrrrrrÊs(
ÿ
ÿÿýÿÿr)F)0Ú__doc__Ú
__future__rÚ    itertoolsrrrrûÚrrr„r    r
Úbaser rÎr rrZenginerrÓrZ sql.elementsrZsql.selectablerr r?rHr!r;r@r&r'r<rCr(r)r=rDr*rÜrµrÍrIrrrrrÚ<module>
sn                 
S++Q ù jù G8.÷ p÷ DwdL)a