o znh]}@sdZddlZddlZddlmZddlmZddlmZddlmZdd lm Z dd l m Z ddl mZ dd l m Z dd l mZdd l mZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddl mZda a!ddZ"ddZ#ddZ$d2dd Z%d!d"Z&d#d$Z'Gd%d&d&e(Z)Gd'd(d(e)Z*d)d*Z+d+d,Z,d-d.Z-d/e-_.d0d1Z/dS)3z(Internal implementation for declarative.N)instrumentation) clsregistry)event)exc)util) class_mapper)mapper) mapperlib)synonym)QueryableAttribute)_is_mapped_class)InspectionAttr)MapperProperty)ColumnProperty)CompositeProperty)Column)Table) expression) topologicalcCs,t|r t|St|rt|ddSdS)NF) configure)_DeferredMapperConfighas_clsconfig_for_clsrr clsrJ/usr/local/lib/python3.10/dist-packages/sqlalchemy/ext/declarative/base.py_declared_mapping_info%s   rcCsZ|turdSt|dddr!|jD]}t|}|dur|SqdSt|}|dur+|S|S)N __abstract__Tstrict)object_get_immediate_cls_attr __bases__"_resolve_for_abstract_or_classical"_dive_for_classically_mapped_class)rsup classicalrrrr&0s r&cCsLt|drdSt|}|dur|S|jD]}t|}|dur#|SqdS)N_decl_class_registry)hasattrrmanager_of_classr%r')rmanagerr(r rrrr'Cs   r'FcCstt|tsdS|jD]-}t|d}| ot|du}||jvr7||us0|r+||jvr7n |s7|s7t||Sq dS)areturn an attribute of the class that is either present directly on the class, e.g. not on a superclass, or is from a superclass but this superclass is a non-mapped mixin, that is, not a descendant of the declarative base and is also not classically mapped. This is used to detect attributes that indicate something about a mapped class independently from any mapped classes that it may inherit from. Nr*) issubclassr#__mro__r+r'__dict__r%getattr)rattrnamer"base_is_declarative_inherits_is_classicial_inheritsrrrr$Ws&     r$cCsBtdurddlmattjfat|dddrdSt|||dS)Nr) declared_attrr Tr!)r6apir classpropertydeclarative_propsr$ _MapperConfig setup_mapping)r classnamedict_rrr_as_declarativeys   r>cCs0t|trt|ddrtd||fdSdS)N _cascadingFz~@declared_attr.cascading is not supported on the %s attribute on class %s. This attribute invokes for subclasses in any case.T) isinstancer9r1rwarn)objnamerrrr_check_declared_props_nocascades  rDc@sxeZdZeddZddZddZddZd d Zd d Z d dZ ddZ ddZ ddZ ddZddZddZdS)r:cCs6t|dddp t|d}|rt}nt}||||dS)N_sa_decl_prepare_nocascadeTr!_sa_decl_prepare)r$r+rr:)rcls_r<r= defer_mapcfg_clsrrrr;sz_MapperConfig.setup_mappingcCs||_t||_||_d|_t|_t|_ i|_ | i|j_ | tjz$t|j|j|||||WtjdStjwN)rdictr=r<persist_selectabler OrderedDict propertiessetdeclared_columns column_copies_setup_declared_events_sa_declared_attr_reg_scan_attributesr _CONFIGURE_MUTEXacquirer add_class_extract_mappable_attributes_extract_declared_columns _setup_table_setup_inheritance_early_mappingrelease)selfrGr<r=rrr__init__s&    z_MapperConfig.__init__cCs |dSrJ)mapr^rrrr\s z_MapperConfig._early_mappingcsPtjdrttdfdd}tjdr&ttdfdd}dSdS) N__declare_last__after_configuredcjdSrJ)rrbrrarrrcz>_MapperConfig._setup_declared_events..after_configured__declare_first__before_configuredcrdrJ)rrfrrarrrgrez?_MapperConfig._setup_declared_events..before_configured)r$rr listens_forr )r^rcrgrrarrRs    z$_MapperConfig._setup_declared_eventsc s|j|j}|j}d}d}}d}jD]}|uo(t|duo(t|ddd }|s4|ur4||t|D]\} } | dkrUt | | } |sT|rN| rTfdd}q:| dkrit | | } |sh|re| rhj }q:| dkrt | | } |s|ry| rj }t |t ttdfstd |urd}q:|rt | trtd |j| |fq:|ur0t | trq:t | trtd t | tr)t | tj} | s| jr| |vrtd | f| | || <|| <} t| | n(| rtd t| } t | tr| j rt | j!ts| j"} | || <|| <t | ttfr(| j#dur(| j$| _#q:|%|| | q:q|r:|s:d}||_&||_'||_(dS)NrETr!__mapper_args__cs tjSrJ)rKrirrrrmapper_args_fns z6_MapperConfig._scan_attributes..mapper_args_fn __tablename____table_args__z3__table_args__ value must be a tuple, dict, or NonezRegular (i.e. not __special__) attribute '%s.%s' uses @declared_attr, but owning class %s is mapped - not applying to subclass %s.zMapper properties (i.e. deferred,column_property(), relationship(), etc.) must be declared as @declared_attr callables on declarative mixin classes.zXAttribute '%s' on class %s cannot be processed due to @declared_attr.cascading; skippingzJUse of sqlalchemy.util.classproperty on declarative classes is deprecated.))rr=rQr/rr$_produce_column_copiesvarsitemsrDrkrlr@tuplerKtyper ArgumentErrorr9rrA__name__rrInvalidRequestErrorr8r?__get__setattrwarn_deprecatedr1r_is_internal_proxyoriginal_property descriptordoc__doc___warn_for_decl_attributes table_args tablenamerj)r^r=rQrjr~inherited_table_argsrr3 class_mappedrCrB check_decl oldclasspropretrrrrTs                      r z_MapperConfig._scan_attributescCs&t|tjrtd||fdSdS)NzAttribute '%s' on class %s appears to be a non-schema 'sqlalchemy.sql.column()' object; this won't be part of the declarative mapping)r@r ColumnClauserrA)r^rkeycrrrr}cs z'_MapperConfig._warn_for_decl_attributescCs|j}|j}|j}t|D]A\}}t|trPt|||ur q|jr(t d||vrPd|vr:|j p4||dj vsP| ||<}|j|_t||||||<qdS)NzvColumns with foreign keys to other columns must be declared as @declared_attr callables on declarative mixin classes. __table__)rr=rQrnror@rr1 foreign_keysrrtrCrcopy_creation_orderrv)r^r3rr=rQrCrBcopy_rrrrmls(  z$_MapperConfig._produce_column_copiescCsN|j}|j}|j}t|ddd}t|D]}|dvrq||}t|tr:t|tr4|jr4t d|jt ||}nt|t rT|j |urT|j|krTt|j}t|||t|trpt|dkrpt|dttfrpt d|qt|ttfs|d s|||||||st|||q|d krtd t||}|||<qdS) NrETr!)rrkrizUse of @declared_attr.cascading only applies to Declarative 'mixin' and 'abstract' classes. Currently, this flag is ignored on mapped class %srrzIgnoring declarative-like tuple value of attribute '%s': possibly a copy-and-paste error with a comma accidentally placed at the end of the line?__metadatazdAttribute name 'metadata' is reserved for the MetaData instance when using a declarative base class.)rr=rNr$listr@r9r6r?rrAr1r class_rr rvrplenrr startswithpopr}rrtr_deferred_relationship)r^rr= our_stuff late_mappedkvalueproprrrrXsb             z*_MapperConfig._extract_mappable_attributesc s|jjfddd|j}tt}tD]R\}}t|t t frN|j D]#}t|t rL|j durLt||t|t sG||j|||q)qt|t rmt||||j|||||jkrm|=q|D]\}}t|dkrtd|j|dt|fqrdS)Ncs |jSrJrrrrrs z9_MapperConfig._extract_declared_columns..rrzzOn class %r, Column object %r named directly multiple times, only one will be used: %s. Consider using orm.synonym insteadz, )rNsortrP collections defaultdictrOrror@rrcolumnsrtable_undefer_column_namerCaddrrrrAr<joinsorted)r^rPname_to_prop_keyrrcolrCkeysrrrrYs<          z'_MapperConfig._extract_declared_columnsc Cs4|j}|j}|j}|j}|j}t|ddd}|_d}t|dr(t|j }nt }d|vr}|dur|di}} |r[t |t rA|} nt |t r[t |dt rY|dd|d}} n|}|d } | rfd | d <|||jgt |t |Ri| |_}n|j}|r|D]} |j| std | jq||_dS) NcSs|jSrJr)rrrrrsz,_MapperConfig._setup_table..r __table_cls__rrr __autoload__Tautoloadz8Can't add additional column %r when specifying __table__)rrr~r=rPrr+runbound_method_to_callablerrr@rKrpgetrrrcontains_columnrrrr local_table) r^rrr~r=rPr table_clsargstable_kwrrrrrrZsZ         z_MapperConfig._setup_tablec Csr|j}|j}|j}|j}g}|jD]}t|}|durqt|dur.t|ddds.||q|rFt |dkr@t d||f|d|_ nd|_ |dur^|j dur^t|ds^t d||j rt|j }|j}|j } |dur|rwt d |D]=}|j|jvr|j|j|urqyt d |||j|jf|jrt d ||| dur| |ur| |qydSdSdS) NrETr!rz&Class %s has multiple mapped bases: %rr __no_table__zwClass %r does not have a __table__ or __tablename__ specified and does not inherit from an existing table-mapped class.z?Can't place __table_args__ on an inherited class with no table.z;Column '%s' on class %s conflicts with existing column '%s'zDCan't place primary key columns on an inherited class with no table.)rrr~rPr%r&rr$appendrrrtinheritsrLrrrCr primary_key append_column_refresh_for_new_column) r^rrr~rPrrinherited_mapperinherited_tableinherited_persist_selectablerrrr['s           z _MapperConfig._setup_inheritancec s>|j}|jr |}ni}dD]}||vr"||}|j||||<qd|vs+Jd|jr3|j|d<|jr|ddst|jj}d|vritfdd|jD j pXd |d<}| d d|j Dt |D]"\}}t|tjszqo|jvrj|}t|tr|g|j||<qo|} || d <| |_dS) N)version_id_colpolymorphic_onrz=Can't specify 'inherits' explicitly with declarative mappingsconcreteFexclude_propertiescsg|] }|jvr|jqSr)_columntopropertyr.0rrrr s  z;_MapperConfig._prepare_mapper_arguments..rcSsg|]}|jqSrrrrrrrsrN)rNrjrQrrrrrOrunionrdifference_updaterPrror@r ColumnElement_propsrrr mapper_args) r^rNrrvrrrpresult_mapper_argsrrr_prepare_mapper_argumentsrsN            z'_MapperConfig._prepare_mapper_argumentscCsR|t|jdrt|jj}nt}||j|jfi|j|j_ }|j` |S)N__mapper_cls__) rr+rrrrr rr __mapper__rS)r^ mapper_clsmp_rrrr`s z_MapperConfig.mapN)rs __module__ __qualname__ classmethodr;r_r\rRrTr}rmrXrYrZr[rr`rrrrr:s   $  F'3K .cSsg|]}||jfqSrrrrrrrrscss|]}|j|fVqdSrJrrrrr sz9_DeferredMapperConfig.classes_for_base..c3s(|]}|vr|fVqdSrJr)rr) all_m_by_clsm_clsrrrs)rvaluesrKextendr%rrr)rrrclasses_for_basetuplesr)rrrrrs  z&_DeferredMapperConfig.classes_for_basecs|j|jdtt|SrJ)rrrsuperrr`ra __class__rrr`sz_DeferredMapperConfig.map)T)rsrrrrMrr\propertyrsetterrrrrrrr` __classcell__rrrrrs$       rcCsd|jvrt|trt|||j||j||dSt|trG|j D]}t|tr=|j dur=t|||j|q&|j||dSt|t rY|j|t ||dSt|tru|j|krut|j}|j|t ||dSt||||jdSt|||dS)zadd an attribute to an existing declarative class. This runs through the logic to determine MapperProperty, adds it to the Mapper, adds a column to the mapped Table, etc. rN)r0r@rrrrr add_propertyrrrrrrr rr rq __setattr___expire_memoizations)rrrrrrr_add_attributes0            rcCsjd|jvr-||jvr-|jjs-|j|}t|ttttfr tdt |||j dSt ||dS)NrzrDr#r:rrrrrsrrrrrsR                      " .B%