U SWUU @szddlmZWnek r(eZYnXddlmZddlZddlTzddlmZWn>ek rzddl mZWnek rdZYnXYnXzddl m Z Wnek rdZ YnXe ddd d d d d ddddddddddddddddddd d!d"d#d$d%gZ Gd&d'd'eZGd(d)d)eZGd*d+d+eZGd,d-d-eZGd.d/d/eZGd0d1d1eZed2d3ZGd4d5d5eZGd6d7d7eZd:d8d9ZdS);) OrderedDict) namedtupleN)*) FIELD_TYPE) postgres_extandasassertbreakclasscontinuedefdelelifelseexceptexecfinallyforfromglobalifimportinislambdanotorpassprintraisereturntrywhilewithyieldc@s eZdZdS) UnknownFieldN)__name__ __module__ __qualname__r*r*/reflection.pyr&sr&c@s\eZdZdZeefZdddZddZdd Z d d Z d d Z ddZ dddZ ddZdS)Columnz1 Store metadata about a database column. FNc CsF||_||_||_||_||_||_||_||_d|_d|_ d|_ dSN) name field_classraw_column_typenullable primary_key db_columnindexunique rel_model related_nameto_field) selfr.r/r0r1r2r3r4r5r*r*r+__init__'szColumn.__init__cs4dddddg}dfdd|D}d j|fS) Nr/r0r1r2r3, c3s |]}d|t|fVqdSz%s=%sN)getattr).0attrr9r*r+ >sz"Column.__repr__..zColumn(%s, %s))joinr.)r9attrsZ keyword_argsr*r@r+__repr__7szColumn.__repr__cCsi}|jrd|d<|jtks(|j|jkr6d|j|d<|jrN|jtk rNd|d<|r|j|d<|j rtd|j |d<|j rd|j |d<| s|j rd |d <n|j r|sd |d <|S) NTnullz'%s'r3r2r6r8r7Truer5r4)r1r/ForeignKeyFieldr.r3r2PrimaryKeyFieldis_foreign_keyr6r8r7is_primary_keyr5r4)r9paramsr*r*r+get_field_parametersCs&  zColumn.get_field_parameterscCs|jtkp|jSr-)r/rHr2r@r*r*r+rJ_szColumn.is_primary_keycCs |jtkSr-)r/rGr@r*r*r+rIbszColumn.is_foreign_keycCs|jtko|jdkSNz'self')r/rGr6r@r*r*r+is_self_referential_fkes zColumn.is_self_referential_fkcCsJ||_t|_|j|jkr d|_n ||j|_|r6|jp8d|_|pBd|_dSrM) foreign_keyrGr/ dest_tabletabler6r.r8r7)r9rO model_namesdestr7r*r*r+set_foreign_keyis  zColumn.set_foreign_keycCsT|}dddt|D}d|j|jj|f}|jtkrPd||jf}|S)Nr;css|]\}}d||fVqdSr<r*)r>kvr*r*r+rAwsz#Column.get_field..z %s = %s(%s)z%s # %s) rLrBsorteditemsr.r/r'r&r0)r9Z field_paramsZ param_strfieldr*r*r+ get_fieldts   zColumn.get_field)FNFF)NN)r'r(r)__doc__ IntegerFieldrHZprimary_key_typesr:rDrLrJrIrNrTrZr*r*r*r+r,!s    r,c@sVeZdZiZdZddZddZdddZdd d Zdd d Z dd dZ dddZ dS)MetadatacCs||_d|_dS)NF)databaserequires_extension)r9r_r*r*r+r:szMetadata.__init__cGs|j||Sr-)r_Z execute_sql)r9ZsqlrKr*r*r+executeszMetadata.executeNc Cstdd|j||D}|||}|||}t|dkr\|d}||tkr\t||<t}|D]*\}} t |||| j | j | j |d||<qj|S)Ncss|]}|j|fVqdSr-r.)r>metadatar*r*r+rAsz'Metadata.get_columns..r)r/r0r1r2r3) rr_ get_columnsget_column_typesget_primary_keyslenr\rHrXr, data_typerEr2) r9rQschemarc column_typesZpk_namesZpkcolumnsr.Z column_datar*r*r+res(      zMetadata.get_columnscCstdSr-)NotImplementedErrorr9rQrjr*r*r+rfszMetadata.get_column_typescCs|j||Sr-)r_get_foreign_keysrnr*r*r+roszMetadata.get_foreign_keyscCs|j||Sr-)r_rgrnr*r*r+rgszMetadata.get_primary_keyscCs|j||Sr-)r_ get_indexesrnr*r*r+rpszMetadata.get_indexes)N)N)N)N)N) r'r(r) column_mapextension_importr:rarerfrorgrpr*r*r*r+r]s    r]cseZdZeeeeeeeee e e e e e e e edZdZfddZddZdfdd Zdfd d Zdfd d Zdfdd ZZS)PostgresqlMetadata)iiiii:iZii;iii z$from playhouse.postgres_ext import *cs|tt||tdk rx|d}|}|D]H\}}d|krLtj|j|<q.d|krbtj|j|<q.d|kr.tj |j|<q.dS)Nz!select oid, typname from pg_type;ZjsonZhstoreZtsvector) superrsr:rraZfetchall JSONFieldrq HStoreField TSVectorField)r9r_cursorresultsZoidZtypname __class__r*r+r:s  zPostgresqlMetadata.__init__cCszi}tdk r ttjtjtjfnt}d||f}|d|}|jD].}|j|j t ||j <||j |krFd|_ qF|S)Nz "%s"."%s"zSELECT * FROM %s LIMIT 1T) rsetr{r}r|ra descriptionrqget type_coder&r.r`)r9rQrjrkZextension_typesZ identifierr~column_descriptionr*r*r+rfs&   z#PostgresqlMetadata.get_column_typesNcs|pd}tt|||SNZpublic)rzrsrernrr*r+reszPostgresqlMetadata.get_columnscs|pd}tt|||Sr)rzrsrornrr*r+rosz#PostgresqlMetadata.get_foreign_keyscs|pd}tt|||Sr)rzrsrgrnrr*r+rgsz#PostgresqlMetadata.get_primary_keyscs|pd}tt|||Sr)rzrsrprnrr*r+rpszPostgresqlMetadata.get_indexes)N)N)N)N)r'r(r) BooleanField BlobFieldBigIntegerFieldr\ TextField FloatField CharField DateField DateTimeField TimeField DecimalFieldrqrrr:rfrerorgrp __classcell__r*r*rr+rss2 rsc(seZdZedkriZn|ejeejeej e ej e ej eejeejeejeejeejeejeejeejeejeejeeje ejeejeej eej!eiZfddZ"dddZ#Z$S) MySQLMetadataNc s.d|kr|d|d<tt|j|f|dS)NZpasswordZpasswd)poprzrr:)r9r_kwargsrr*r+r:szMySQLMetadata.__init__cCsDi}|d|}|jD]&}|dd\}}|j|t||<q|S)NzSELECT * FROM `%s` LIMIT 1)rarrqrr&)r9rQrjrkr~rr.rr*r*r+rf#s  zMySQLMetadata.get_column_types)N)%r'r(r)rrqZBLOBrZCHARrZDATErZDATETIMErZDECIMALrZDOUBLErZFLOATZINT24r\Z LONG_BLOBZLONGZLONGLONGrZ MEDIUM_BLOBZ NEWDECIMALZSHORTSTRING TIMESTAMPZTIMErZ TINY_BLOBZTINYZ VAR_STRINGr:rfrr*r*rr+rsZ rc@sbeZdZeeeeeeee e e e ee e e e e e dZdZdZdjeedZdZddZd d d Zd S) SqliteMetadata)ZbigintZblobboolZbooleanchardateZdatetimeZdecimalZintegerzinteger unsignedintZlongrealZ smallintegerZsmallintzsmallint unsignedtexttimez (?:["\[\(]+)?z (?:["\]\)]+)?zi(?:FOREIGN KEY\s*)?{begin}(.+?){end}\s+(?:.+\s+)?references\s+{begin}(.+?){end}\s*\(["|\[]?(.+?)["|\]]?\))beginendz&^\s*(?:var)?char\s*\(\s*(\d+)\s*\)\s*$cCsR|}||jkr|j|}n0t|j|r2t}ntdd|}|j|t}|S)Nz\(.+\)r^) lowerrqresearch re_varcharrsubrr&)r9Z column_typer0r/r*r*r+_map_colPs  zSqliteMetadata._map_colNcCs0i}|j|}|D]}||j||j<q|Sr-)r_rerrir.)r9rQrjrkrlcolumnr*r*r+rf[s  zSqliteMetadata.get_column_types)N)r'r(r)rrrrrrrr\rrrrqrrformatZre_foreign_keyrrrfr*r*r*r+r1s: r_DatabaseMetadata)rl primary_keys foreign_keysrRindexesc@seZdZddZddZdS)DatabaseMetadatacsLg}jD]8}t|jdkrfdd|jD}|||jfq|S)Nrdcs*g|]"}|jkrj|jqSr*)rlr.)r>rr9rQr*r+ rsz9DatabaseMetadata.multi_column_indexes..)rrhrlappendr5)r9rQaccumr4 field_namesr*rr+multi_column_indexesns z%DatabaseMetadata.multi_column_indexescCs6i}|j|D]"}t|jdkr|j||jd<q|S)Nrdr)rrhrlr5)r9rQrr4r*r*r+column_indexesxs zDatabaseMetadata.column_indexesN)r'r(r)rrr*r*r*r+rms rc@sxeZdZeegZdddZddZedddZ dd Z d d Z d d Z ddZ ddZddZdddZdddZdS) IntrospectorNcCs||_||_dSr-)rcrj)r9rcrjr*r*r+r:szIntrospector.__init__cCs d|jjS)Nzrcr_r@r*r*r+rDszIntrospector.__repr__cCs<t|trt|}nt|tr(t|}nt|}|||dSNrj) isinstanceZPostgresqlDatabasersZ MySQLDatabaserr)clsr_rjrcr*r*r+ from_databases     zIntrospector.from_databasecCs t|jjSr-)typercr_r@r*r*r+get_database_classszIntrospector.get_database_classcCs |jjjSr-rr@r*r*r+get_database_nameszIntrospector.get_database_namecCs |jjjSr-)rcr_Zconnect_kwargsr@r*r*r+get_database_kwargssz Introspector.get_database_kwargscCs|jjrd|jjSdS)N r^)rcr`rrr@r*r*r+get_additional_importss z#Introspector.get_additional_importscCs@tdd|}ddd|dD}|dsrr*r*r+rAsz/Introspector.make_model_name.._rT)rrrBsplitisalpha)r9rQmodelZ model_namer*r*r+make_model_names  zIntrospector.make_model_namecCs@tdd|p|}tdd|}|tkr<|d7}|S)Nz_id$r^rr)rrrstripRESERVED_WORDS)r9rr*r*r+make_column_names zIntrospector.make_column_namec s|jr|jjj|jd}n |jj}dk r@fdd|D}i}i}i}i}i}|D]D}|j||j} |j||j} z|j||j||<Wn4tk r} zt| j g||<W5d} ~ XYnX| |||<t dd| D} | D]>\} }| | }| }|dr,|| kr,| }||_q| D]@}t|jdkr8|jd}|| kr8|j| |_d | |_q8|j||j||<| ||<| ||<qXi}d d }|D]}t }t|||d D]d}z|||j}Wntk rYqYnX|j}||kr"d ||jf||<n ||qʐq|D]n}||D]^}||j|j}z||j|j}Wntk rd}YnX|j|||||dqDq8t|||||S)Nrcsg|]}|kr|qSr*r*)r>rQ table_namesr*r+rsz+Introspector.introspect..css|]}|VqdSr-)r)r>Z column_namer*r*r+rAsz*Introspector.introspect..Z_idrdrTcSs|jSr-)r)rOr*r*r+z)Introspector.introspect..)keyz %s_%s_set)rOrRrSr7) rjrcr_Z get_tablesrprero ValueErrorerrargsrrrXrrendswithr.rhrlr5r4rgrWrKeyErrorrPaddrQZ dest_columnrTrr)r9rZtablesrlrrrRrrQZ table_indexesZ table_columnsexcZlower_col_namesZcol_namernew_nameZ lower_namer4Z related_namesZsort_fnZmodels_referencedrOrPsrcrSr*rr+ introspects              zIntrospector.introspectFcsdj|di}GfdddtfddtjD]\}}||krD||qD|S)NrcseZdZGfdddZdS)z/Introspector.generate_models..BaseModelcseZdZjjZdS)z4Introspector.generate_models..BaseModel.MetaN)r'r(r)rcr_r*r@r*r+Meta!srN)r'r(r)rr*r@r*r+ BaseModel srcs"j|D]$}|j}||kr ||kr ||q gj|}|D]\}}|jrF|jqF||}Gfddd}d} t dkr| t dkrt fdd|D|_d} d|i} |D]\}}|j } | t krt} ||jd } |jr*| r*| tkr t} d| d <n|jrD| tk rDd| d <|r|rbd | d <n|jj} || | d <|jr|j| d <d||f| d<||kr|s||rd| d<n|sd| d<| f| | |j<qztt|f| ||<Wntk rsYnXdS)NcseZdZZdS)zAIntrospector.generate_models.._create_model..MetaN)r'r(r)rr*)rr*r+r4srFrrdcsg|]\}}|kr|jqSr*rb)r>colrY)rr*r+r<szGIntrospector.generate_models.._create_model..T)r3rEr2r9r6r8z %s_%s_relr7r5r4)rrPrlrXr2rr.rrrhkeysZ CompositeKeyr/r&Z BareFieldr1rHr\rIrNrOr8rJrstrr)rQmodelsrOrSrlr3rrrZ composite_keyrCZ FieldClassrKrP)r _create_modelr_ skip_invalid)rrr+r$sj                  z3Introspector.generate_models.._create_model)rZModelrWrRrX)r9rrrrQrr*)rrr_r9rr+generate_modelss F zIntrospector.generate_models)N)N)N)FN)r'r(r)rHr\Z pk_classesr:rD classmethodrrrrrrrrrr*r*r*r+rs   lrcCstj||d}|Sr)rrr)r_rjZ introspectorr*r*r+rqsr)N) collectionsr ImportErrordictrrZpeeweeZMySQLdb.constantsrZpymysql.constantsZ playhouserrrobjectr&r,r]rsrrrrrrr*r*r*r+sz   c3L.4 r