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
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
U
£ý°d"^ã
@s4dZddlZddlmZmZddlmZmZmZmZm    Z    m
Z
m Z m Z m Z ddlmZddlmZddlmZddlmZdd    lmZmZdd
lmZz|ddlZdd lmZdd lm Z dd l!m"Z"ddl#m$Z$ddl%m&Z&ddl'm(Z(ddl)m*Z*ddl+m,Z,m-Z-m.Z.m/Z/m0Z0Wn4e1k
rDZ2zede2›ƒe2‚W5dZ2[2XYnXzddl3m4Z4Wne1k
rpdZ5YnXdZ5ddl6m7Z7ddl8m9Z9ddl:m;Z;ddl<m=Z=ddl>m?Z?ddl@mAZAddlBmCZCejDjEZEejDjFZFejDjGZGejDjHZHejDjIZIee0dœd d!„ZJGd"d#„d#ƒZKGd$d%„d%eƒZLGd&d'„d'e"ƒZMdS)(a¥Django database Backend using MySQL Connector/Python.
 
This Django database backend is heavily based on the MySQL backend from Django.
 
Changes include:
* Support for microseconds (MySQL 5.6.3 and later)
* Using INFORMATION_SCHEMA where possible
* Using new defaults for, for example SQL_AUTO_IS_NULL
 
Requires and comes with MySQL Connector/Python v8.0.22 and later:
    http://dev.mysql.com/downloads/connector/python/
éN)ÚdatetimeÚtime)    ÚAnyÚDictÚ    GeneratorÚIteratorÚListÚOptionalÚSetÚTupleÚUnion)Úsettings)ÚImproperlyConfigured)ÚIntegrityError)ÚBaseDatabaseWrapper)Ú    dateparseÚtimezone)Úcached_property)ÚMySQLConnection)ÚCMySQLConnection)ÚMySQLConverter)Ú MySQLCursor)Ú CMySQLCursor)Ú
HexLiteral)ÚPooledMySQLConnection)ÚParamsDictTypeÚParamsSequenceOrDictTypeÚParamsSequenceTypeÚRowTypeÚ
StrOrBytesz&Error loading mysql.connector module: )Údatetime_to_mysqlFTé)ÚDatabaseClient)ÚDatabaseCreation)ÚDatabaseFeatures)ÚDatabaseIntrospection)ÚDatabaseOperations)ÚDatabaseSchemaEditor)ÚDatabaseValidation©ÚvalueÚreturncCsftjrLt |¡r8t d|›dt¡t ¡}t ||¡}|     tj
¡j dd}t r\t |ƒ}|S| d¡S)zDEquivalent to DateTimeField.get_db_prep_value. Used only by raw SQL.z!MySQL received a naive datetime (z$) while time zone support is active.N)Útzinfoz%Y-%m-%d %H:%M:%S.%f)r ZUSE_TZrZis_naiveÚwarningsÚwarnÚRuntimeWarningZget_default_timezoneZ
make_awareÚ
astimezoneÚutcÚreplaceÚ    HAVE_CEXTr Ústrftime)r*Zdefault_timezoneZmysql_datetime©r5úRd:\z\workplace\vscode\pyvenv\venv\Lib\site-packages\mysql/connector/django/base.pyÚ$adapt_datetime_with_timezone_supportbs
 
ý r7c@sèeZdZdZdZeeefddœdd„Ze    e
e
dœdd    „ƒZ e    e e e e dœd
d „ƒZdee ee eeeefddfd œd d„Zeeeedfeefe eeeefddfd œdd„Zeedœdd„Zeedœdd„ZdS)Ú CursorWrapperzãWrapper around MySQL Connector/Python's cursor class.
 
    The cursor class is defined by the options passed to MySQL
    Connector/Python. If buffered option is True in those options,
    MySQLCursorBuffered will be used.
    )iišiëi¹N)Úcursorr+cCs
||_dS©N)r9©Úselfr9r5r5r6Ú__init__ƒszCursorWrapper.__init__)Úargsr+cCs<|s|St|ƒ}| ¡D]\}}t|tƒrt|ƒ||<q|Sr:)ÚdictÚitemsÚ
isinstancerr7)r>Únew_argsÚkeyr*r5r5r6Ú_adapt_execute_args_dict†s
z&CursorWrapper._adapt_execute_args_dictcCs@|s|St|ƒ}t|ƒD]\}}t|tƒrt|ƒ||<qt|ƒSr:)ÚlistÚ    enumeraterArr7Útuple)r>rBÚiÚargr5r5r6Ú_adapt_execute_args‘s
z!CursorWrapper._adapt_execute_args)Úqueryr>r+c
Cs‚d}t|tƒr| |¡}n
| |¡}z|j ||¡WStjjk
r|}z&|j    d|j
krjt t |j    ƒŽd‚‚W5d}~XYnXdS)z­Executes the given operation
 
        This wrapper method around the execute()-method of the cursor is
        mainly needed to re-raise using different exceptions.
        Nr) rAr?rDrJr9ÚexecuteÚmysqlÚ    connectorÚOperationalErrorr>Úcodes_for_integrityerrorrrG)r<rKr>rBÚexcr5r5r6rLžs
 
zCursorWrapper.execute.c
Cs^z|j ||¡WStjjk
rX}z&|jd|jkrFtt|jƒŽd‚‚W5d}~XYnXdS)z±Executes the given operation
 
        This wrapper method around the executemany()-method of the cursor is
        mainly needed to re-raise using different exceptions.
        rN)    r9Ú executemanyrMrNrOr>rPrrG)r<rKr>rQr5r5r6rR²s zCursorWrapper.executemany©Úattrr+cCs t|j|ƒS)z%Return an attribute of wrapped cursor)Úgetattrr9©r<rTr5r5r6Ú __getattr__ÆszCursorWrapper.__getattr__©r+cCs
t|jƒS)z&Return an iterator over wrapped cursor)Úiterr9©r<r5r5r6Ú__iter__ÊszCursorWrapper.__iter__)N)Ú__name__Ú
__module__Ú __qualname__Ú__doc__rPr rrr=Ú staticmethodrrDr    rrJÚstrrrrLr rrRrrWrrr[r5r5r5r6r8ts2
þ ÿþ 
ÿÿù r8csPeZdZUdZdZddddddd    d
d ddd d d ddddd ddddddddddœZdZddddddd d!d"d#ddddd$œZd%Zd&d'd(d)d*d+d,œZ    d-Z
e e e d.<d/d0d1d2hZejZeZeZeZeZeZeZeZe e d-d3œ‡fd4d5„ Z!e e"d6œd7d8„Z#e$e e fd9œd:d;„Z%e$e e fe&e'e(e)fd<œd=d>„Z*d-d9œd?d@„Z+dae e,dAœdBdC„Z-d-d9œdDdE„Z.e"d-dFœdGdH„Z/e"d9œdIdJ„Z0d-d9œdKdL„Z1dbe e2e d-dMœdNdO„Z3e"d9œdPdQ„Z4e5e6e d9œdRdS„ƒƒZ7e5e$e e fd9œdTdU„ƒZ8e5e$e e fd9œdVdW„ƒZ9e5e d9œdXdY„ƒZ:e5e;e<dZfd9œd[d\„ƒZ=e5e>e d9œd]d^„ƒZ?e@e"d9œd_d`„ƒZA‡ZBS)cÚDatabaseWrapperz Represent a database connection.rMzinteger AUTO_INCREMENTzbigint AUTO_INCREMENTÚlongblobÚboolzvarchar(%(max_length)s)Údatez datetime(6)z+numeric(%(max_digits)s, %(decimal_places)s)Zbigintzdouble precisionÚintegerzchar(15)zchar(39)Újsonzbigint UNSIGNEDzinteger UNSIGNEDzsmallint UNSIGNEDzsmallint AUTO_INCREMENTZsmallintÚlongtextztime(6)zchar(32))Z    AutoFieldZ BigAutoFieldZ BinaryFieldZ BooleanFieldZ    CharFieldZ    DateFieldZ DateTimeFieldZ DecimalFieldZ DurationFieldZ    FileFieldZ FilePathFieldZ
FloatFieldZ IntegerFieldZBigIntegerFieldZIPAddressFieldZGenericIPAddressFieldZ    JSONFieldZNullBooleanFieldZ OneToOneFieldÚPositiveBigIntegerFieldÚPositiveIntegerFieldÚPositiveSmallIntegerFieldZ    SlugFieldZSmallAutoFieldZSmallIntegerFieldZ    TextFieldZ    TimeFieldZ    UUIDField)    ZtinyblobZblobZ
mediumblobrcZtinytextÚtextZ
mediumtextrhrgz= %szLIKE %szLIKE BINARY %szREGEXP BINARY %sz    REGEXP %sz> %sz>= %sz< %sz<= %s)ÚexactZiexactÚcontainsÚ    icontainsÚregexZiregexÚgtZgteÚltZlteÚ
startswithÚendswithÚ istartswithÚ    iendswithzCREPLACE(REPLACE(REPLACE({}, '\\', '\\\\'), '%%', '\%%'), '_', '\_')z"LIKE BINARY CONCAT('%%', {}, '%%')zLIKE CONCAT('%%', {}, '%%')zLIKE BINARY CONCAT({}, '%%')zLIKE CONCAT({}, '%%')zLIKE BINARY CONCAT('%%', {})zLIKE CONCAT('%%', {}))rnrorsrurtrvNÚisolation_levelzread uncommittedzread committedzrepeatable readZ serializable)r>Úkwargsr+csjtƒj||Ž|j d¡}|rV| dt ¡|_| dt¡}t|tƒsLtdƒ‚|ƒ|_    ntƒ|_    t |_dS)NÚOPTIONSÚuse_pureÚconverter_classzXConverter class should be a subclass of mysql.connector.django.base.DjangoMySQLConverter)
Úsuperr=Ú settings_dictÚgetr3Ú    _use_pureÚDjangoMySQLConverterÚ
issubclassÚProgrammingErrorÚ    converter)r<r>rxÚoptionsr{©Ú    __class__r5r6r=<s þ
ÿ
zDatabaseWrapper.__init__rScCs| d¡rdSt‚dS)NZmysql_isF)rsÚAttributeErrorrVr5r5r6rWPs
zDatabaseWrapper.__getattr__rXcCsfdddddœ}|j}|dr(|d|d<|dr<|d|d<|d    rP|d    |d
<|d  d ¡rl|d |d <n|d r€|d |d<|dr˜t|dƒ|d<| di¡ d¡rº|dd|d<tj|d<tjjj    j
g|d<zt|d  ¡}|  d¡}|r8|  ¡}||jkr8d dd„t|jƒDƒ¡}td|›d|›dƒ‚||_| |¡Wntk
r`YnX|S)NÚutf8TF)ÚcharsetZ use_unicodeZbufferedZconsume_resultsÚUSERÚuserÚNAMEZdatabaseZPASSWORDÚpasswdZHOSTú/Z unix_socketÚhostZPORTÚportryZ init_commandZraise_on_warningsZ client_flagsrwz, css|]}d|›dVqdS)ú'Nr5)Ú.0Úlevelr5r5r6Ú    <genexpr>|sz8DatabaseWrapper.get_connection_params.<locals>.<genexpr>z%Invalid transaction isolation level 'z' specified.
Use one of z
, or None.)r}rsÚintr~r ÚDEBUGrMrNÚ    constantsZ
ClientFlagZ
FOUND_ROWSÚcopyÚpopÚlowerÚisolation_levelsÚjoinÚsortedrrwÚupdateÚKeyError)r<rxr}r„rwZ valid_levelsr5r5r6Úget_connection_paramsUsPü    
 
þ 
 
ÿÿz%DatabaseWrapper.get_connection_params)Ú conn_paramsr+cCs"d|krt|d<tjjf|Ž}|S)Nr{)r€rMrNÚconnect)r<r¡Zcnxr5r5r6Úget_new_connectionŠsz"DatabaseWrapper.get_new_connectionc    Cs¢g}|jjr| d¡|jr2| d|j ¡›¡|rZ| ¡}| d |¡¡W5QRXd|jkržz|     |jd¡Wn$t
k
rœ|  |jd¡YnXdS)NzSET SQL_AUTO_IS_NULL = 0z(SET SESSION TRANSACTION ISOLATION LEVEL z; Z
AUTOCOMMIT) ÚfeaturesZis_sql_auto_is_null_enabledÚappendrwÚupperr9rLrœr}Zset_autocommitr‡Ú_set_autocommit)r<Z assignmentsr9r5r5r6Úinit_connection_state“s
ÿ
 
z%DatabaseWrapper.init_connection_state)Únamer+cCs|j ¡}t|ƒSr:)Ú
connectionr9r8)r<r©r9r5r5r6Ú create_cursor¬s
zDatabaseWrapper.create_cursorcCs(zt |¡Wntk
r"YnXdSr:)rÚ    _rollbackÚNotSupportedErrorrZr5r5r6r¬°szDatabaseWrapper._rollback)Ú
autocommitr+c    Cs|j||j_W5QRXdSr:)Zwrap_database_errorsrªr®)r<r®r5r5r6r§¶szDatabaseWrapper._set_autocommitc    Cs"| ¡}| d¡W5QRXdS)z¿
        Disable foreign key checks, primarily for use in adding rows with
        forward references. Always return True to indicate constraint checks
        need to be re-enabled.
        zSET foreign_key_checks=0T)r9rLr;r5r5r6Údisable_constraint_checkingºs
z+DatabaseWrapper.disable_constraint_checkingc    Cs>d|j|_}z"| ¡}| d¡W5QRXW5||_XdS)zM
        Re-enable foreign key checks after they have been disabled.
        FzSET foreign_key_checks=1N)Úneeds_rollbackr9rL)r<r°r9r5r5r6Úenable_constraint_checkingÄs
 
z*DatabaseWrapper.enable_constraint_checking)Ú table_namesr+c
Csî| ¡Ü}|dkr|j |¡}|D]¼}|j ||¡}|s:q"|j ||¡}|D]\}}}| d|›d|›d|›d|›d|›d|›d|›d    |›d
¡| ¡D]@}    td |›d |    d ›d|›d|›d|    d›d|›d|›dƒ‚qšqLq"W5QRXdS)a]
        Check each table name in `table_names` for rows with invalid foreign
        key references. This method is intended to be used in conjunction with
        `disable_constraint_checking()` and `enable_constraint_checking()`, to
        determine if rows with invalid references were entered while constraint
        checks were off.
        Nz+
                        SELECT REFERRING.`z&`,
                        REFERRING.`z `
                        FROM `z2` as REFERRING
                        LEFT JOIN `zR` as REFERRED
                        ON (
                            REFERRING.`z*` =
                            REFERRED.`zE`
                        )
                        WHERE REFERRING.`z4` IS NOT NULL
                        AND REFERRED.`z"` IS NULL
                        zThe row in table 'z' with primary key 'rz' has an invalid foreign key: Ú.z contains a value 'r!z.' that does not have a corresponding value in )r9Ú introspectionr²Zget_primary_key_columnZget_key_columnsrLZfetchallr)
r<r²r9Z
table_nameZprimary_key_column_nameZ key_columnsZ column_nameZreferenced_table_nameZreferenced_column_nameZbad_rowr5r5r6Úcheck_constraintsÑsN
 ÿüÿþýüþùþùÿ 6ÿz!DatabaseWrapper.check_constraintscCs*z|j ¡Wntk
r$YdSXdS)NFT)rªZpingÚErrorrZr5r5r6Ú    is_usables
zDatabaseWrapper.is_usablecCsdS)z Display name.ZMySQLr5r5r5r5r6Ú display_nameszDatabaseWrapper.display_namecCs|jjrddddœ}|SiS)z<Mapping of Field objects to their SQL for CHECK constraints.z`%(column)s` >= 0)rirjrk)r¤Z!supports_column_check_constraints)r<rµr5r5r6Údata_type_check_constraintssýz+DatabaseWrapper.data_type_check_constraintsc    Cs\| ¡}| d¡| ¡}W5QRX|d|d|dt|dƒt|dƒt|dƒdœS)    zReturn MySQL server data.a2
                SELECT VERSION(),
                       @@sql_mode,
                       @@default_storage_engine,
                       @@sql_auto_is_null,
                       @@lower_case_table_names,
                       CONVERT_TZ('2001-01-01 01:00:00', 'UTC', 'UTC') IS NOT NULL
            rr!éééé)ÚversionÚsql_modeZdefault_storage_engineZsql_auto_is_nullZlower_case_table_namesZhas_zoneinfo_database)Útemporary_connectionrLÚfetchonerd)r<r9Úrowr5r5r6Úmysql_server_datas
ÿ
 
 
 
úz!DatabaseWrapper.mysql_server_datac
Cs6| ¡$}| d¡| ¡dW5QR£SQRXdS)úReturn MySQL version.zSELECT VERSION()rN)rÀrLrÁr;r5r5r6Úmysql_server_info5s
 
z!DatabaseWrapper.mysql_server_info.c    Cs.| ¡}tjjf|Ž}| ¡}W5QRX|S)rÄ)r rMrNr¢Zget_server_version)r<ÚconfigÚconnZserver_versionr5r5r6Ú mysql_version<szDatabaseWrapper.mysql_versionc    Cs@| ¡}| d¡| ¡}W5QRXt|r:|d d¡ndƒS)zReturn SQL mode.zSELECT @@sql_moderú,r5)r9rLrÁÚsetÚsplit)r<r9r¿r5r5r6r¿Ds
 
zDatabaseWrapper.sql_modecCs
|j}|S)z1Return True if pure Python version is being used.)r)r<Zansr5r5r6rzLszDatabaseWrapper.use_pure)N)N)Cr\r]r^r_ÚvendorÚ
data_typesZ_limited_data_typesÚ    operatorsZ pattern_escZ pattern_opsrwr    raÚ__annotations__r›rMrNZDatabaser'ZSchemaEditorClassr"Z client_classr#Zcreation_classr$Zfeatures_classr%Zintrospection_classr&Z    ops_classr(Zvalidation_classrr=rdrWrr r rrrr£r¨r8r«r¬r§r¯r±rrµr·rr`r¸r¹rÃrÅr r•rÈr
r¿ÚpropertyrzÚ __classcell__r5r5r…r6rbÏsÄ
ä$ òú    ü6
 þ     
 0 rbc@sˆeZdZdZedeeeedœdd„ƒZ    edeeee
dœdd„ƒZ e e eefdœd    d
„Ze e eefdœd d „Zeedœd d„ZdS)r€zCustom converter for Django.N)r*Údscr+cCst | d¡¡S)zXReturn MySQL TIME data type as datetime.time()
 
        Returns datetime.time()
        zutf-8)rZ
parse_timeÚdecode©r*rÒr5r5r6Ú_time_to_pythonXsz$DjangoMySQLConverter._time_to_pythoncCs|rt |¡SdS)aoConnector/Python always returns naive datetime.datetime
 
        Connector/Python always returns naive timestamps since MySQL has
        no time zone support.
 
        - A naive datetime is a datetime that doesn't know its own timezone.
 
        Django needs a non-naive datetime, but in this method we don't need
        to make a datetime value time zone aware since Django itself at some
        point will make it aware (at least in versions 3.2.16 and 4.1.2) when
        USE_TZ=True. This may change in a future release, we need to keep an
        eye on this behaviour.
 
        Returns datetime.datetime()
        N)rÚ_datetime_to_pythonrÔr5r5r6rÖ`sz(DjangoMySQLConverter._datetime_to_pythonr)cCs
| |¡Sr:©Z _str_to_mysql©r<r*r5r5r6Ú_safestring_to_mysqlusz)DjangoMySQLConverter._safestring_to_mysqlcCs
| |¡Sr:r×rØr5r5r6Ú_safetext_to_mysqlxsz'DjangoMySQLConverter._safetext_to_mysqlcCs
| |¡Sr:)Z_bytes_to_mysqlrØr5r5r6Ú_safebytes_to_mysql{sz(DjangoMySQLConverter._safebytes_to_mysql)N)N)r\r]r^r_r`Úbytesrr    rrÕrrÖrar rrÙrÚrÛr5r5r5r6r€Ssr€)Nr_r-rrÚtypingrrrrrr    r
r r Z django.confr Zdjango.core.exceptionsrZ    django.dbrZdjango.db.backends.base.baserZ django.utilsrrZdjango.utils.functionalrZmysql.connectorrMZmysql.connector.connectionrZmysql.connector.connection_cextrZmysql.connector.conversionrZmysql.connector.cursorrZmysql.connector.cursor_cextrZmysql.connector.custom_typesrZmysql.connector.poolingrZmysql.connector.typesrrrrrÚ ImportErrorÚerrZ_mysql_connectorr r3Úclientr"Zcreationr#r¤r$r´r%Ú
operationsr&Zschemar'Z
validationr(rNr¶Z DatabaseErrorr­rOr‚r7r8rbr€r5r5r5r6Ú<module>sZ ,             "
       [