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
U
¸ý°d¾Nã@sfdZddlmZddlmZddlmZddlmZddlmZddlmZddlm    Z    dd    lm
Z
dd
lm Z dd lm Z dd lm Z dd lmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlm Z ddlm!Z!ddl"m#Z#dd l"m$Z$dd!l"m%Z%dd"l&m'Z'e rÒdd#l(m)Z)dd$lm*Z*dd%lm+Z+dd&lm,Z,dd'lm-Z-dd(l.m/Z/dd)l0m1Z1e d*ed+Z2Gd,d-„d-ƒZ3Gd.d/„d/ej4ej5ƒZ6ej7ej8j9d0d1Gd2d3„d3ej:ej;ƒƒƒZ<Gd4d5„d5ƒZ=Gd6d7„d7ee2ƒZ>Gd8d9„d9e>e2ƒZ?d:S);zèWrite-only collection API.
 
This is an alternate mapped attribute style that only supports single-item
collection mutation operations.   To read the collection, a select()
object must be executed each time.
 
.. versionadded:: 2.0
 
 
é)Ú annotations)ÚAny)ÚGeneric)ÚIterable)ÚNoReturn)ÚOptional)Úoverload)ÚTuple)Ú TYPE_CHECKING)ÚTypeVar)ÚUnion)Ú    bindparamé)Ú
attributes)Ú
interfaces)Ú relationships)Ú
strategies)Ú object_mapper)Ú PassiveFlag)ÚRelationshipDirectioné)Úexc)Úinspect)Úlog)Úutil)Údelete)Úinsert)Úselect)Úupdate)ÚDelete)ÚInsert)ÚUpdate)ÚLiteral)Ú _InstanceDict)Ú_AdaptedCollectionProtocol)ÚAttributeEventToken)ÚCollectionAdapter)ÚLoaderCallableStatus)Ú InstanceState)ÚSelectÚ_T)Úboundc@sReZdZdZddd„Zedd„ƒZedd„ƒZd    d
„Zd d „Z    d d„Z
dd„Z dS)ÚWriteOnlyHistoryzDOverrides AttributeHistory to receive append/remove events directly.NcCsp|rH|tj@r&t d|›d|›d¡‚|j|_|j|_|j|_|j|_n$t     ¡|_t     ¡|_t     ¡|_d|_dS)Nz
Attribute z¬ can't load the existing state from the database for this operation; full iteration is not permitted.  If this is a delete operation, configure passive_deletes=True on the z- relationship in order to resolve this error.F)
rÚSQL_OKrÚInvalidRequestErrorÚunchanged_itemsÚ added_itemsÚ deleted_itemsÚ_reconcile_collectionrZOrderedIdentitySet)ÚselfÚattrÚstateÚpassiveÚapply_to©r8úOd:\z\workplace\vscode\pyvenv\venv\Lib\site-packages\sqlalchemy/orm/writeonly.pyÚ__init__Gs
ÿ
 
 
 
zWriteOnlyHistory.__init__cCst|j |j¡ƒS©N)Úlistr0Úunionr/©r3r8r8r9Úadded_plus_unchanged\sz%WriteOnlyHistory.added_plus_unchangedcCst|j |j¡ |j¡ƒSr;)r<r0r=r/r1r>r8r8r9Ú    all_items`s
ÿÿzWriteOnlyHistory.all_itemscCs`|jr0|j |j¡}|j |j¡}|j |¡}n|j|j|j}}}t t|ƒt|ƒt|ƒ¡Sr;)    r2r0Ú
differencer/r1Ú intersectionrZHistoryr<)r3ÚaddedZdeletedZ    unchangedr8r8r9Ú
as_historyhsý
zWriteOnlyHistory.as_historycCst|jƒ|Sr;)r<r0)r3Úindexr8r8r9ÚindexeduszWriteOnlyHistory.indexedcCs|j |¡dSr;)r0Úadd©r3Úvaluer8r8r9Ú    add_addedxszWriteOnlyHistory.add_addedcCs(||jkr|j |¡n |j |¡dSr;)r0Úremover1rGrHr8r8r9Ú add_removed{s
zWriteOnlyHistory.add_removed)N) Ú__name__Ú
__module__Ú __qualname__Ú__doc__r:Úpropertyr?r@rDrFrJrLr8r8r8r9r,Ds
 
 
 r,c s~eZdZdZdZdZdZdZdZdZ    e
Z ‡fdd„Z e jfdd„Zed:d    d
d d d dœdd„ƒZed;d    d
ddd dœdd„ƒZed<d    d
ddddœdd„ƒZdejfd    d
ddddœdd„Zejdd„ƒZejdd„ƒZd=dd„Zd>dd „Zd!d"„Zdejdddfd    d
d#d$dd#d%d%d&d'œ    d(d)„Zd*d+„Zd,d-„Ze jfd.d/„Ze jfd0d1„Z d2d3„Z!e jfd4d5„Z"e jfd6d7„Z#e jfd8d9„Z$‡Z%S)?ÚWriteOnlyAttributeImplTFr8c s4tƒj||||f|Ž||_t|_|r0t|ƒ|_dSr;)Úsuperr:Ú target_mapperÚWriteOnlyCollectionÚ query_classÚtupleÚorder_by)r3Úclass_ÚkeyZ typecallableÚdispatchrTrXÚkw©Ú    __class__r8r9r:Žs
 
zWriteOnlyAttributeImpl.__init__cCs*|tj@s| |tj¡jS| ||¡SdSr;)rr-Ú_get_collection_historyÚPASSIVE_NO_INITIALIZEr0rV)r3r5Údict_r6r8r8r9Úgetžs 
ÿzWriteOnlyAttributeImpl.get.zInstanceState[Any]r#z Literal[None]z Literal[PassiveFlag.PASSIVE_OFF]r&)r5raÚ    user_datar6ÚreturncCsdSr;r8©r3r5rarcr6r8r8r9Úget_collection¦sz%WriteOnlyAttributeImpl.get_collectionr$rcCsdSr;r8rer8r8r9rf°sz$Optional[_AdaptedCollectionProtocol]zIUnion[Literal[LoaderCallableStatus.PASSIVE_NO_RESULT], CollectionAdapter]cCsdSr;r8rer8r8r9rfºs
NcCs4|tj@s| ||¡j}n| ||¡}|j}t|ƒSr;)rr-r_r0r?ÚDynamicCollectionAdapter)r3r5rarcr6ÚdataÚhistoryr8r8r9rfÆs
    
 cCst |tj¡Sr;)rr%Z    OP_APPENDr>r8r8r9Ú _append_tokenÖsz$WriteOnlyAttributeImpl._append_tokencCst |tj¡Sr;)rr%Z    OP_REMOVEr>r8r8r9Ú _remove_tokenÚsz$WriteOnlyAttributeImpl._remove_tokencCsd|dkr| ||¡}| |¡|jjD]}||||p8|jƒ}q&|jr`|dk    r`| t |¡|d¡dS©NT)    Ú_modified_eventrJr[ÚappendrjÚ trackparentÚ sethasparentrÚinstance_state©r3r5rarIÚ    initiatorÚcollection_historyÚfnr8r8r9Úfire_append_eventÞs 
 z(WriteOnlyAttributeImpl.fire_append_eventcCsd|dkr| ||¡}| |¡|jr@|dk    r@| t |¡|d¡|jjD]}||||pZ|jƒqHdS)NF)    rmrLrorprrqr[rKrkrrr8r8r9Úfire_remove_eventìs 
 z(WriteOnlyAttributeImpl.fire_remove_eventcCsJ|j|jkr$| ||tj¡|j|j<| ||tj¡d||j<|j|jSrl)rZÚcommitted_stateÚcollection_history_clsrÚPASSIVE_NO_FETCHrmrZ    NEVER_SET)r3r5rar8r8r9rmús ÿ 
z&WriteOnlyAttributeImpl._modified_eventrzOptional[AttributeEventToken]ÚboolÚNone)    r5rarIrsr6Ú    check_oldÚpopÚ_adaptrdc    Csö|r|j|jkrdS|r$|dkr$dS|}    t|    ƒ}
|jrd|jsNt d|›d¡‚t |j|||d¡} |     ||¡} |js~| j
} n |   | j
¡} |   |
¡} t |
¡  | ¡}|   | ¡}|
D] }||kr²|j|||d| dq²|D]}|j|||d| dqØdS)Nz Collection "zV" does not support implicit iteration; collection replacement operations can't be used©r6)rt)Z parent_tokenr<Ú has_identityÚ_supports_dynamic_iterationrr.rZ IdentitySetrbrmr0r=rBrArvrw)r3r5rarIrsr6r}r~rÚiterableZ
new_valuesZold_collectionrtÚ    constantsZ    additionsZremovalsÚmemberr8r8r9ÚsetsP  
ÿÿ ÿ
 
ûûzWriteOnlyAttributeImpl.setcOs
tƒ‚dSr;©ÚNotImplementedError)r3ÚargsÚkwargsr8r8r9rEszWriteOnlyAttributeImpl.deletecCs tdƒ‚dS)Nz7Dynamic attributes don't support collection population.r‡)r3r5rarIr8r8r9Úset_committed_valueHsÿz*WriteOnlyAttributeImpl.set_committed_valuecCs| ||¡}| ¡Sr;)r_rD©r3r5rar6Úcr8r8r9Ú get_historyMs z"WriteOnlyAttributeImpl.get_historycCs| ||¡}dd„|jDƒS)NcSsg|]}t |¡|f‘qSr8)rrq)Ú.0Úxr8r8r9Ú
<listcomp>Usz:WriteOnlyAttributeImpl.get_all_pending.<locals>.<listcomp>)r_r@rŒr8r8r9Úget_all_pendingQs z&WriteOnlyAttributeImpl.get_all_pendingcCsT|j|jkr|j|j}n| ||tj¡}|jrL|tj@rL|j||||dS|SdS)N)r7)rZrxryrrzrrZINIT_OK)r3r5r6rr8r8r9r_Ws ÿÿz.WriteOnlyAttributeImpl._get_collection_historycCs||k    r| ||||¡dSr;)rv©r3r5rarIrsr6r8r8r9rnfszWriteOnlyAttributeImpl.appendcCs||k    r| ||||¡dSr;)rwr“r8r8r9rKqszWriteOnlyAttributeImpl.removecCs|j|||||ddS)Nr€)rKr“r8r8r9r~|szWriteOnlyAttributeImpl.pop)..)..)..)N)N)&rMrNrOZ uses_objectsZdefault_accepts_scalar_loaderZsupports_populationr‚Z
collectionZdynamicrXr,ryr:rZ PASSIVE_OFFrbrrfrrZmemoized_propertyrjrkrvrwrmr†rr‹rzrŽr`r’r_rnrKr~Ú __classcell__r8r8r]r9rR‚sh û    û    ûû
 
ÿ
ÿ
÷ =ÿ
ú
ú
úrRZ
write_only)Zlazyc@seZdZeZdd„ZdS)ÚWriteOnlyLoaderc    Cs\d|_|jr |jjtjtjfkr0t d|j¡‚t    j
|j|d|j |jj |jj |jjddS)NTztOn relationship %s, 'dynamic' loaders cannot be used with many-to-one/one-to-one relationships and/or uselist=False.)Z    useobjectÚ
impl_classrTrXrV)Zis_class_levelZuselistZparent_propertyÚ    directionrÚ    ONETOMANYZ
MANYTOMANYrr.rZ_register_attributer–ÚmapperrXrV)r3r™r8r8r9Úinit_class_attributeŒs& þþÿùz$WriteOnlyLoader.init_class_attributeN)rMrNrOrRr–ršr8r8r8r9r•‡sr•c@s8eZdZdZdd„Zdd„Zdd„Zdd    „Zd
d „Zd S) rgz9simplified CollectionAdapter for internal API consistencycCs
||_dSr;)rh)r3rhr8r8r9r:¦sz!DynamicCollectionAdapter.__init__cCs
t|jƒSr;)Úiterrhr>r8r8r9Ú__iter__©sz!DynamicCollectionAdapter.__iter__cCsdSr;r8r>r8r8r9Ú _reset_empty¬sz%DynamicCollectionAdapter._reset_emptycCs
t|jƒSr;)Úlenrhr>r8r8r9Ú__len__¯sz DynamicCollectionAdapter.__len__cCsdSrlr8r>r8r8r9Ú__bool__²sz!DynamicCollectionAdapter.__bool__N)    rMrNrOrPr:rœrrŸr r8r8r8r9rg£s rgc@s@eZdZdZesdZdd„Zdddœdd    „Zd
dd œd d „ZdS)ÚAbstractCollectionWriterzsVirtual collection which includes append/remove methods that synchronize
    into the attribute event system.
 
    r8cCs~| ¡|_}||_t|ƒ}|j|jj}|jdk    rH|j ¡|jf|_    nd|_    |j
|ddf|_ |jj rt|jj |_ nd|_ dS)Nr8F)Zalias_secondary)ÚobjÚinstancer4rÚ_propsrZZ    secondaryr™Z__clause_element__Ú    _from_objZ _with_parentÚ_where_criteriarXÚ_order_by_clauses)r3r4r5r£r™Úpropr8r8r9r:¿s
 
 ÿ z!AbstractCollectionWriter.__init__ú Iterable[_T]r|©ÚiteratorrdcCs0|D]&}|j t |j¡t |j¡|d¡qdSr;)r4rnrrqr£Ú instance_dict)r3r«Úitemr8r8r9Ú _add_all_implÞs
 
üz&AbstractCollectionWriter._add_all_implr*©r­rdcCs&|j t |j¡t |j¡|d¡dSr;)r4rKrrqr£r¬©r3r­r8r8r9Ú _remove_implçs 
 
üz%AbstractCollectionWriter._remove_implN)    rMrNrOrPr
Ú    __slots__r:r®r±r8r8r8r9r¡¶s     r¡c@sŠeZdZdZdZddœdd„Zddœdd    „Zd
dœd d „Zd dœdd„Zddœdd„Z    dddœdd„Z
dddœdd„Z dddœdd„Z dS)rUaWrite-only collection which can synchronize changes into the
    attribute event system.
 
    The :class:`.WriteOnlyCollection` is used in a mapping by
    using the ``"write_only"`` lazy loading strategy with
    :func:`_orm.relationship`.     For background on this configuration,
    see :ref:`write_only_relationship`.
 
    .. versionadded:: 2.0
 
    .. seealso::
 
        :ref:`write_only_relationship`
 
    )r£r4r¦r¥r§r)rdcCs tdƒ‚dS)Nz°WriteOnly collections don't support iteration in-place; to query for collection items, use the select() method to produce a SQL statement and execute it with session.scalars().)Ú    TypeErrorr>r8r8r9rœ    sÿzWriteOnlyCollection.__iter__zSelect[Tuple[_T]]cCs<t|jjƒj|jŽ}|jr&|j|jŽ}|jr8|j|jŽ}|S)z‘Produce a :class:`_sql.Select` construct that represents the
        rows within this instance-local :class:`_orm.WriteOnlyCollection`.
 
        )    rr4rTÚwherer¦r¥Ú select_fromr§rX)r3Zstmtr8r8r9rs   zWriteOnlyCollection.selectz
Insert[_T]cCs€t|jƒ}|j}|j|jj}|jtjk    r4t     
d¡‚i}|j D],\}}|  |||j |¡}td|d||j<q>t|jjƒjf|ŽS)aNFor one-to-many collections, produce a :class:`_dml.Insert` which
        will insert new rows in terms of this this instance-local
        :class:`_orm.WriteOnlyCollection`.
 
        This construct is only supported for a :class:`_orm.Relationship`
        that does **not** include the :paramref:`_orm.relationship.secondary`
        parameter.  For relationships that refer to a many-to-many table,
        use ordinary bulk insert techniques to produce new objects, then
        use :meth:`_orm.AbstractCollectionWriter.add_all` to associate them
        with the collection.
 
 
        z…Write only bulk INSERT only supported for one-to-many collections; for many-to-many, use a separate bulk INSERT along with add_all().N)Z    callable_)rr£r™r¤r4rZr—rr˜rr.Zsynchronize_pairsZ_get_attr_w_warn_on_noneÚdictr rrTÚvalues)r3r5r™r¨raÚlÚrrur8r8r9rs"
 ÿüzWriteOnlyCollection.insertz
Update[_T]cCst|jjƒj|jŽS)zŒProduce a :class:`_dml.Update` which will refer to rows in terms
        of this instance-local :class:`_orm.WriteOnlyCollection`.
 
        )rr4rTr´r¦r>r8r8r9rDszWriteOnlyCollection.updatez
Delete[_T]cCst|jjƒj|jŽS)zŒProduce a :class:`_dml.Delete` which will refer to rows in terms
        of this instance-local :class:`_orm.WriteOnlyCollection`.
 
        )rr4rTr´r¦r>r8r8r9rKszWriteOnlyCollection.deleter©r|rªcCs| |¡dS)zÐAdd an iterable of items to this :class:`_orm.WriteOnlyCollection`.
 
        The given items will be persisted to the database in terms of
        the parent instance's collection on the next flush.
 
        N©r®)r3r«r8r8r9Úadd_allRszWriteOnlyCollection.add_allr*r¯cCs| |g¡dS)zÂAdd an item to this :class:`_orm.WriteOnlyCollection`.
 
        The given item will be persisted to the database in terms of
        the parent instance's collection on the next flush.
 
        Nrºr°r8r8r9rG[szWriteOnlyCollection.addcCs| |¡dS)z®Remove an item from this :class:`_orm.WriteOnlyCollection`.
 
        The given item will be removed from the parent instance's collection on
        the next flush.
 
        N)r±r°r8r8r9rKdszWriteOnlyCollection.removeN) rMrNrOrPr²rœrrrrr»rGrKr8r8r8r9rUðs (        rUN)@rPÚ
__future__rÚtypingrrrrrrr    r
r r Zsqlalchemy.sqlr ÚrrrrÚbaserrrrrrrZsqlrrrrZsql.dmlrr r!Z util.typingr"Ú_typingr#r$r%r&r'r5r(Zsql.selectabler)r*r,ZHasCollectionAdapterZ AttributeImplrRZ class_loggerZRelationshipPropertyZ strategy_forZAbstractRelationshipLoaderZ
Identifiedr•rgr¡rUr8r8r8r9Ú<module>
sj                                       >
ÿ :