K i9.ddlZddlddlmZddlmZddlmZddlmZddlmZdZ dd Zdd Z dd Z dd Z Gd de Z ddZGddeZy)N)*)Alias)CompoundSelectQuery)Metadata) callable_)__deprecated__c0|r t|StSN)set)ss Y/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/playhouse/shortcuts.pyr ss1vc |dn|}|dk(rd}tt|}fd} |pjd|jD]P} t| trj| %t| t s6|j| j Ri} tt|}|zt|} | r|jjjD]\}}| |rj||jjj|jf|jjjD]}j|g}t!||D]%}|j#t%||||dz '|| |<|jj&D]}| |r |j(j+|j,}t|t.r?|r=|9t!||j,}t%||||t1|fz|dz }nd}|| |j,<|r.|D])}t!||}t3|r || |<%|| |<+|r|r|jj4jD]\}}|jd k(rt!| |j}|vs|vr5r |vr|vr@g}j|t!||j}|D]%}|j#t%||||dz '|| |j<| S) a8 Convert a model instance (and any related objects) to a dictionary. :param bool recurse: Whether foreign-keys should be recursed. :param bool backrefs: Whether lists of related objects should be recursed. :param only: A list (or set) of field instances indicating which fields should be included. :param exclude: A list (or set) of field instances that should be excluded from the dictionary. :param list extra_attrs: Names of model instance attributes or methods that should be included. :param SelectQuery fields_from_query: Query that was source of model. Take fields explicitly selected by the query and serialize them. :param int max_depth: Maximum depth to recurse, value <= 0 means no max. :param bool manytomany: Process many-to-many fields. NrFc |vxsxr|vSr )nexcludeonlys r rzmodel_to_dict..'sQ'\Ht/G$r __sentinel__)recursebackrefsrr max_depth)rrrrseenr+) _clone_setadd _returning isinstanceFieldr_aliastype_meta manytomanyitemsupdate rel_modelbackref through_modelrefsgetattrappend model_to_dict sorted_fields__data__getnameForeignKeyFieldr rr)modelrrrrr extra_attrsfields_from_queryrr& should_skipitemdata model_classr3m2mfkfaccumrel_objfield field_data attr_nameattr foreign_keyr) descriptor related_querys `` r r/r/s]& 'YIA~ d D[)KHK$  %00 -D$&D%( ,  - D!G d D tOGu+K//557 ID#4  NNC!4!4!?!? !LM N((..33 ! C  !E"5$/ . ]#%#'!m -. .DJ# &**& u  ^^'' 3 e_ -'%!%4*#%#UH -'!m- " %UZZ'&*$ 'I5),D"&&Y"&Y  'G&+kk&:&:&@&@&B . "K""c)8 k.A.ABJW$ w(>4/k6ME KK $#E;+>+>?M( . ]#%#'!m -. .).D$$ %+ .. Krc |j}t|jDcgc]}|j|fc}}|j D]H\}}||j vr|j |}d} n7||vr||}d} n+|rt |||Ctd|dt|dt|t} | sO| rMt|tr= |j|j} t ||jt| ||| rqt|t t"fr[|D cgc]} t%|j&| |} } | D]} t | |j|t ||j| 2t ||j|K|Scc}w#t$r|j} YwxYwcc} w)NFTzUnrecognized attribute "z" for model class .)r%dictrr*r'combinedsetattrAttributeErrorr$r!r4__rel__r3KeyErrorr)update_model_from_dictlisttuple dict_to_modelr5)instancer:ignore_unknownmetafkrkeyvaluer@ is_backrefis_foreign_key rel_instancerow_data instancess r rOrOs >>D >"bjj"%>?Hjjl!1 U $-- MM#&EJ H_SMEJ  Hc5 )  03T(^"EF F$E?;nE41H 1'// ;   &|UNK MJutUm<!&'ekk8^D'I'!* <  ejj(; < HemmY 7 Hejj% 0C!1F OK?* 1$0  1'sFF'F>F;:F;c&t|||Sr )rO)r;r:rTs r rRrRs !+-~ FFrcZ|jjjD]1\}}|j|vs||vrt |r|n|}|||<3t |j\}}t |j|}|j||jS)a Helper for generating conditional INSERT queries. For example, prevent INSERTing a new tweet if the user has tweeted within the last hour:: INSERT INTO "tweet" ("user_id", "content", "timestamp") SELECT 234, 'some content', now() WHERE NOT EXISTS ( SELECT 1 FROM "tweet" WHERE user_id = 234 AND timestamp > now() - interval '1 hour') Using this helper: cond = ~fn.EXISTS(Tweet.select().where( Tweet.user == user_obj, Tweet.timestamp > one_hour_ago)) iq = insert_where(Tweet, { Tweet.user: user_obj, Tweet.content: 'some content'}, where=cond) res = iq.execute() )columns) r%defaultsr'r3rzipSelectwhere insert_from as_rowcount) clsr:rdr@defaultrXfieldsvaluessqs r insert_whererls2)),,224w :: $&w/ WU $**,'NFF   % %e ,B ??2v & 2 2 44rc`eZdZdZedfedfedfedfedffZfdZd fd Zfd Zd Z xZ S) ReconnectMixina Mixin class that attempts to automatically reconnect to the database under certain error conditions. For example, MySQL servers will typically close connections that are idle for 28800 seconds ("wait_timeout" setting). If your application makes use of long-lived connections, you may find your connections are closed after a period of no activity. This mixin will attempt to reconnect automatically when these errors occur. This mixin class probably should not be used with Postgres (unless you REALLY know what you are doing) and definitely has no business being used with Sqlite. If you wish to use with Postgres, you will need to adapt the `reconnect_errors` attribute to something appropriate for Postgres. 2006201320144031zMySQL Connection not available.ctt| |i|i|_|jD]M\}}|jj |g|j|j |jOyr )superrn__init___reconnect_errorsreconnect_errors setdefaultr.lower)selfargskwargs exc_class err_fragment __class__s r ruzReconnectMixin.__init__su nd,d=f="$'+'<'< K #I|  " " - -i <  " "9 - 4 4\5G5G5I J Krc\| td|jtt|||S)Nz,"commit" has been deprecated and is a no-op.)r _reconnectrtrn execute_sql)rzsqlparamscommitrs r rzReconnectMixin.execute_sqls1   I Ju^TF"F, ,rcH|jtt|g|i|Sr )rrtrnbeginrzr{r|rs r rzReconnectMixin.begins/tu^T@0 $0(.0 0rct ||i|S#t$r}|jr|t|}||jvr|t |j }|j|D]}||vsn||j s |j|j||i|cYd}~Sd}~wwxYwr ) Exceptionin_transactionr$rvstrry is_closedcloseconnect)rzfuncr{r|excr}exc_reprr~s r rzReconnectMixin._reconnects )(( ( )""$ S I 6 66 3x~~'H $ 6 6y A  8+  >>#  (( (+ )s! B7AB20.wrapped_iterator/sH;;=))+ CJJ'E,#,  sAA) rr!rextendlhsrhsr5r% table_namer r.Valuealias)rrWr>currr;r3rrs`` @r resolve_multimodel_queryr!sG GE yy{ d/ 0 LL$((DHH- . jj   ++#  uT{0056   rc@eZdZdZfdZdZdZeeeZxZ S)ThreadSafeDatabaseMetadataz Metadata class to allow swapping database at run-time in a multi-threaded application. To use: class Base(Model): class Meta: model_metadata_class = ThreadSafeDatabaseMetadata cld|_tj|_t t ||i|yr ) _database threadinglocal_localrtrrurs r ruz#ThreadSafeDatabaseMetadata.__init__As-oo'  ($8$I&IrcDt|jd|jS)Ndatabase)r-rr)rzs r _get_dbz"ThreadSafeDatabaseMetadata._get_dbGst{{J??rcL|j||_||j_yr )rrr)rzdbs r _set_dbz"ThreadSafeDatabaseMetadata._set_dbIs >> !DN! r) rrrrrurrpropertyrrrs@r rr8s'J @")Hrr) TFNNNNNNF)Fr )_model_identifier)rpeeweerrrrrrr/rOrRrlobjectrnrrrrr rsf&!. =A7;EJrj'TG5DK)VK)\.**r