o 3aP? @sRdZddlmZddlmZddlmZddlm Z ddl m Z ddl m Z ddlmZzdd lZWneyCZzed ed Z[wwdd lmZmZdd lmZd dlmZd dlmZd dlmZd dlm Z d dl!m"Z"d dl#m$Z$d dl%m&Z&ej'Z(e(dkredej)ieej*ej+iZ,edZ-GdddZ.Gddde Z/d S)za MySQL database backend for Django. Requires mysqlclient: https://pypi.org/project/mysqlclient/ )ImproperlyConfigured)IntegrityError)utils)BaseDatabaseWrapper) async_unsafe)cached_property)_lazy_re_compileNz:Error loading MySQLdb module. Did you install mysqlclient?)CLIENT FIELD_TYPE) conversions)DatabaseClient)DatabaseCreation)DatabaseFeatures)DatabaseIntrospection)DatabaseOperations)DatabaseSchemaEditor)DatabaseValidation)r rz4mysqlclient 1.4.0 or newer is required; you have %s.z(\d{1,2})\.(\d{1,2})\.(\d{1,2})c@s>eZdZdZdZddZdddZdd Zd d Zd d Z dS) CursorWrappera6 A thin wrapper around MySQLdb's normal cursor class that catches particular exception instances and reraises them with the correct types. Implemented as a wrapper, rather than a subclass, so that it isn't stuck to the particular underlying representation returned by Connection.cursor(). )iiiicCs ||_dSN)cursorselfrr?/usr/lib/python3/dist-packages/django/db/backends/mysql/base.py__init__C zCursorWrapper.__init__Nc CLz|j||WStjy%}z|jd|jvr tt|jd}~wwNr)rexecuteDatabaseOperationalErrorargscodes_for_integrityerrorrtuplerqueryr#errrr FszCursorWrapper.executec Crr)r executemanyr!r"r#r$rr%r&rrrr)QszCursorWrapper.executemanycCs t|j|Sr)getattrr)rattrrrr __getattr__[s zCursorWrapper.__getattr__cCs t|jSr)iterrrrrr__iter__^rzCursorWrapper.__iter__r) __name__ __module__ __qualname____doc__r$rr r)r,r/rrrrr4s   rc @seZdZdZidddddddd d d d d dddddddd dd dddddddddddd d dd!d"d#d d$d%d&d'd(d) Zd*Zd+d,d-d,d.d/d0d1d-d-d,d,d2 Zd3Zd4d5d6d7d8d9d:Zhd;Z e Z e Z e ZeZeZeZeZeZdd?Zd@dAZed_dCdDZdEdFZdGdHZdIdJZ dKdLZ!d_dMdNZ"dOdPZ#e$dQdRZ%e$dSdTZ&e$dUdVZ'e$dWdXZ(e$dYdZZ)e$d[d\Z*e$d]d^Z+dBS)`DatabaseWrappermysql AutoFieldzinteger AUTO_INCREMENT BigAutoFieldzbigint AUTO_INCREMENT BinaryFieldlongblob BooleanFieldbool CharFieldzvarchar(%(max_length)s) DateFielddate DateTimeFieldz datetime(6) DecimalFieldz+numeric(%(max_digits)s, %(decimal_places)s) DurationFieldbigint FileField FilePathField FloatFieldzdouble precision IntegerFieldintegerBigIntegerFieldIPAddressFieldzchar(15)GenericIPAddressFieldzchar(39) JSONFieldjsonzbigint UNSIGNEDzinteger UNSIGNEDzsmallint UNSIGNEDzsmallint AUTO_INCREMENTsmallintlongtextztime(6)zchar(32)) NullBooleanField OneToOneFieldPositiveBigIntegerFieldPositiveIntegerFieldPositiveSmallIntegerField SlugFieldSmallAutoFieldSmallIntegerField TextField TimeField UUIDField) tinyblobblob mediumblobr9tinytexttext mediumtextrNrLz= %szLIKE %szLIKE BINARY %sz> %sz>= %sz< %sz<= %s) exactiexactcontains icontainsgtgteltlte startswithendswith istartswith iendswithzCREPLACE(REPLACE(REPLACE({}, '\\', '\\\\'), '%%', '\%%'), '_', '\_')z"LIKE BINARY CONCAT('%%', {}, '%%')zLIKE CONCAT('%%', {}, '%%')zLIKE BINARY CONCAT({}, '%%')zLIKE CONCAT({}, '%%')zLIKE BINARY CONCAT('%%', {})zLIKE CONCAT('%%', {}))rbrcrhrjrirk>repeatable readread uncommitted serializableread committedcCstdd}|j}|dr|d|d<|dr|d|d<|dr&|d|d<|d d r4|d |d <n |d r>|d |d <|d rJt|d |d<tj|d<|d}|dd}|ry|}||j vryt d|d ddt |j Df||_ |||S)Nutf8)convcharsetUSERuserNAMEdatabasePASSWORDpasswordHOST/ unix_sockethostPORTport client_flagOPTIONSisolation_levelrozKInvalid transaction isolation level '%s' specified. Use one of %s, or None.z, css|]}d|VqdS)z'%s'Nr).0srrr z8DatabaseWrapper.get_connection_params..)django_conversions settings_dictrhintr FOUND_ROWScopypoplowerisolation_levelsrjoinsortedrupdate)rkwargsroptionsrrrrget_connection_paramss@         z%DatabaseWrapper.get_connection_paramscCs0tjdi|}|jttur|jt|S)Nr)r!connectencodersgetbytesr)r conn_params connectionrrrget_new_connections z"DatabaseWrapper.get_new_connectioncCsvg}|jjr |d|jr|d|j|r9|}|d|WddS1s2wYdSdS)NzSET SQL_AUTO_IS_NULL = 0z*SET SESSION TRANSACTION ISOLATION LEVEL %sz; )featuresis_sql_auto_is_null_enabledappendrupperrr r)r assignmentsrrrrinit_connection_states  "z%DatabaseWrapper.init_connection_stateNcCs|j}t|Sr)rrr)rnamerrrr create_cursors zDatabaseWrapper.create_cursorcCs(zt|WdStjyYdSwr)r _rollbackr!NotSupportedErrorr.rrrrs zDatabaseWrapper._rollbackcCs8|j|j|WddS1swYdSr)wrap_database_errorsr autocommit)rrrrr_set_autocommits"zDatabaseWrapper._set_autocommitcCs8|}|dWddS1swYdS)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=0NT)rr rrrrdisable_constraint_checkings   z+DatabaseWrapper.disable_constraint_checkingcCsbd|j|_}z%| }|dWdn1swYW||_dSW||_dS||_w)zM Re-enable foreign key checks after they have been disabled. FzSET foreign_key_checks=1N)needs_rollbackrr )rrrrrrenable_constraint_checkings   z*DatabaseWrapper.enable_constraint_checkingc Cs|W}|dur|j|}|D]A}|j||}|sq|j||}|D]+\}}}|d||||||||f|D]} td|| d||| d||fq&qWddS1s^wYdS)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. Na0 SELECT REFERRING.`%s`, REFERRING.`%s` FROM `%s` as REFERRING LEFT JOIN `%s` as REFERRED ON (REFERRING.`%s` = REFERRED.`%s`) WHERE REFERRING.`%s` IS NOT NULL AND REFERRED.`%s` IS NULL zThe row in table '%s' with primary key '%s' has an invalid foreign key: %s.%s contains a value '%s' that does not have a corresponding value in %s.%s.rr )r introspection table_namesget_primary_key_columnget_key_columnsr fetchallr) rrr table_nameprimary_key_column_name key_columns column_namereferenced_table_namereferenced_column_namebad_rowrrrcheck_constraints)s:     "z!DatabaseWrapper.check_constraintscCs(z|jWdStjyYdSw)NFT)rpingr!Errorr.rrr is_usableQs  zDatabaseWrapper.is_usablecCs|jrdSdS)NMariaDBMySQL)mysql_is_mariadbr.rrr display_nameYzDatabaseWrapper.display_namecCs4|jjrdddd}|jr|jdkrd|d<|SiS)Nz`%(column)s` >= 0)rQrRrS) rzJSON_VALID(`%(column)s`)rK)r!supports_column_check_constraintsr mysql_version)rrrrrdata_type_check_constraints]sz+DatabaseWrapper.data_type_check_constraintscCsp|}|d|}Wdn1swY|d|d|dt|dt|dt|ddS) Na2 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 rr)versionsql_modedefault_storage_enginesql_auto_is_nulllower_case_table_nameshas_zoneinfo_database)temporary_connectionr fetchoner;)rrrowrrrmysql_server_datals      z!DatabaseWrapper.mysql_server_datacCs |jdS)Nr)rr.rrrmysql_server_infos z!DatabaseWrapper.mysql_server_infocCs4t|j}|std|jtdd|DS)Nz8Unable to determine MySQL version from version string %rcss|]}t|VqdSr)r)rxrrrrrz0DatabaseWrapper.mysql_version..)server_version_rematchr Exceptionr%groups)rrrrrrs zDatabaseWrapper.mysql_versioncCsd|jvS)Nmariadb)rrr.rrrrrz DatabaseWrapper.mysql_is_mariadbcCs"|jd}t|r|dSdS)Nr,r)rsetsplit)rrrrrrs zDatabaseWrapper.sql_moder),r0r1r2vendor data_types_limited_data_types operators pattern_esc pattern_opsrr!rSchemaEditorClassr client_classrcreation_classrfeatures_classrintrospection_classr ops_classrvalidation_classrrrrrrrrrrrrrrrrrrrrrrrr4bs     $ %    (      r4)0r3django.core.exceptionsr django.dbrdjango.db.backendsr backend_utilsdjango.db.backends.base.baserdjango.utils.asynciordjango.utils.functionalrdjango.utils.regex_helperrMySQLdbr! ImportErrorerrMySQLdb.constantsr r MySQLdb.convertersr clientr creationrrrrr operationsrschemar validationr version_infor __version__TIME typecast_timerrrr4rrrrsL                 .