B 4]#+@sdZddlmZddlmZddlmZddlmZddlm Z dd lm Z dd lmZdd l m Z d gZ e jGd d d eZdS)z|MapperProperty implementations. This is a private module which defines the behavior of individual ORM- mapped attributes. )absolute_import) attributes)PropComparator)StrategizedProperty)_orm_full_deannotate)log)util) expressionColumnPropertycseZdZdZdZdZejddfddZe dd d d Z d d Z e ddZ ddZfddZddZejfddZddZGdddejeZddZZS)r zDescribes an object attribute that corresponds to a table column. Public constructor is the :func:`.orm.column_property` function. column) _orig_columnscolumnsgroupdeferred instrumentcomparator_factory descriptor extensionactive_historyexpire_on_flushinfodoc strategy_keyZ_creation_orderZ_is_polymorphic_discriminatorZ_mapped_by_synonymZ_deferred_column_loader)z0.7z:class:`.AttributeExtension` is deprecated in favor of the :class:`.AttributeEvents` listener interface. The :paramref:`.column_property.extension` parameter will be removed in a future release.)rcsNtt|dd|D|_dd|D|_|dd|_|dd|_|dd |_|d |j j |_ |d d|_ |d d|_ |d d|_|dd |_d|kr|d|_d|kr|d|_n6x4t|jD] }t|dd}|dk r||_PqWd|_|r*td|j jdt|ft|d|jfd|jff|_dS)a\ Provide a column-level property for use with a Mapper. Column-based properties can normally be applied to the mapper's ``properties`` dictionary using the :class:`.Column` element directly. Use this function when the given column is not directly present within the mapper's selectable; examples include SQL expressions, functions, and scalar SELECT queries. Columns that aren't present in the mapper's selectable won't be persisted by the mapper and are effectively "read-only" attributes. :param \*cols: list of Column objects to be mapped. :param active_history=False: When ``True``, indicates that the "previous" value for a scalar attribute should be loaded when replaced, if not already loaded. Normally, history tracking logic for simple non-primary-key scalar values only needs to be aware of the "new" value in order to perform a flush. This flag is available for applications that make use of :func:`.attributes.get_history` or :meth:`.Session.is_modified` which also need to know the "previous" value of the attribute. :param comparator_factory: a class which extends :class:`.ColumnProperty.Comparator` which provides custom SQL clause generation for comparison operations. :param group: a group name for this property when marked as deferred. :param deferred: when True, the column property is "deferred", meaning that it does not load immediately, and is instead loaded when the attribute is first accessed on an instance. See also :func:`~sqlalchemy.orm.deferred`. :param doc: optional string that will be applied as the doc on the class-bound descriptor. :param expire_on_flush=True: Disable expiry on flush. A column_property() which refers to a SQL expression (and not a single table-bound column) is considered to be a "read only" property; populating it has no effect on the state of data, and it can only return database state. For this reason a column_property()'s value is expired whenever the parent object is involved in a flush, that is, has any kind of "dirty" state within a flush. Setting this parameter to ``False`` will have the effect of leaving any existing value present after the flush proceeds. Note however that the :class:`.Session` with default expiration settings still expires all attributes after a :meth:`.Session.commit` call, however. :param info: Optional data dictionary which will be populated into the :attr:`.MapperProperty.info` attribute of this object. :param extension: an :class:`.AttributeExtension` instance, or list of extensions, which will be prepended to the list of attribute listeners for the resulting descriptor placed on the class. cSsg|]}t|qS)r _labeled).0crrL/opt/alt/python37/lib64/python3.7/site-packages/sqlalchemy/orm/properties.py sz+ColumnProperty.__init__..cSsg|]}tt|qSr)r rr)rrrrrr srNrFZ _instrumentTrrrrrrrz.%s received unexpected keyword argument(s): %sz, r)superr __init__rrpoprrr __class__ Comparatorrrrrrrrreversedgetattr TypeError__name__joinsortedkeysr Zset_creation_orderr)selfrkwargscolr)r$rrr":s:K   zColumnProperty.__init__zsqlalchemy.orm.statezsqlalchemy.orm.strategiescCs|j|jj||j|jS)N)Z InstanceStateZ"_instance_level_callable_processorparentZ class_managerZLoadDeferredColumnskey)r-stateZ strategiesrrr&_memoized_attr__deferred_column_loaders z5ColumnProperty._memoized_attr__deferred_column_loadercCs|jS)zsAllow the ColumnProperty to work in expression before it is turned into an instrumented attribute. )r )r-rrr__clause_element__sz!ColumnProperty.__clause_element__cCs |jdS)zJReturn the primary column or expression for this ColumnProperty. r)r)r-rrrr szColumnProperty.expressioncCs0|js dStj|j|j|||||jddS)N)Z comparator parententityr)rrZregister_descriptorclass_r1rr)r-Zmapperrrrinstrument_classs zColumnProperty.instrument_classcsZtt|t|jdkrVt|jj|jrVt d|j|jd|jd|j fdS)NrzOn mapper %s, primary key column '%s' is being combined with distinct primary key column '%s' in attribute '%s'. Use explicit properties to give each column its own mapped attribute name.r) r!r do_initlenrsetr0Z primary_key issupersetr warnr1)r-)r$rrr8s zColumnProperty.do_initcCst|j|j|j|jdS)N)rrr)r rrrr)r-rrrcopyszColumnProperty.copycCs||jj|||dS)N)passive)get_implr1Zget_committed_value)r-r2Zdict_r r>rrr _getcommitteds zColumnProperty._getcommittedc Cst|js dS|j|krL||j} |s.| ||j<qp||j} | ||| dn$|jrp|j|krp|j||jgdddS)NT)Z no_loader)rr1r?r:Z has_identityZ_expire_attributes) r-ZsessionZ source_stateZ source_dictZ dest_stateZ dest_dictloadZ _recursiveZ_resolve_conflict_mapvalueimplrrrmerges     zColumnProperty.mergec@s<eZdZdZdZddZddZddZd d Zd d Z d S)zColumnProperty.ComparatoraProduce boolean, comparison, and other operators for :class:`.ColumnProperty` attributes. See the documentation for :class:`.PropComparator` for a brief overview. .. seealso:: :class:`.PropComparator` :class:`.ColumnOperators` :ref:`types_operators` :attr:`.TypeEngine.comparator_factory` )r4rcCs8|jr||jjdS|jjd|j|jdSdS)Nr)r5Z parentmapper)ZadapterproprZ _annotateZ _parententity)r-rrr#_memoized_method___clause_element__s  z=ColumnProperty.Comparator._memoized_method___clause_element__cCs,|}y|jStk r&|jjSXdS)N)r4rAttributeErrorrE)r-Zcerrr_memoized_attr_info,s z-ColumnProperty.Comparator._memoized_attr_infocCst||S)zproxy attribute access down to the mapped column. this allows user-defined comparison methods to be accessed. )r'r4)r-r1rrr_fallback_getattr3sz+ColumnProperty.Comparator._fallback_getattrcOs||f||S)N)r4)r-opotherr.rrroperate:sz!ColumnProperty.Comparator.operatecKs|}|||||f|S)N)r4Z _bind_param)r-rJrKr.r/rrrreverse_operate=sz)ColumnProperty.Comparator.reverse_operateN) r) __module__ __qualname____doc__ __slots__rFrHrIrLrMrrrrr% s r%cCst|jjjd|jS)N.)strr0r6r)r1)r-rrr__str__AszColumnProperty.__str__)r)rNrOrPZstrategy_wildcard_keyrQr Zdeprecated_paramsr"Z dependenciesr3r4propertyr r7r8r=rZ PASSIVE_OFFr@rDZ MemoizedSlotsrr%rT __classcell__rr)r$rr st   7N)rPZ __future__rrZ interfacesrrr rr Zsqlr __all__Z class_loggerr rrrr s