
    ,h6%                         S r SSKrSSKJr  SSKJr  SSKJr  SSKJr  SSKJr  S	S
KJ	r	  S	SKJ
r
   " S S\5      r " S S\5      r " S S\5      r\rg)a  

.. dialect:: mysql+mysqldb
    :name: mysqlclient (maintained fork of MySQL-Python)
    :dbapi: mysqldb
    :connectstring: mysql+mysqldb://<user>:<password>@<host>[:<port>]/<dbname>
    :url: https://pypi.org/project/mysqlclient/

Driver Status
-------------

The mysqlclient DBAPI is a maintained fork of the
`MySQL-Python <https://sourceforge.net/projects/mysql-python>`_ DBAPI
that is no longer maintained.  `mysqlclient`_ supports Python 2 and Python 3
and is very stable.

.. _mysqlclient: https://github.com/PyMySQL/mysqlclient-python

.. _mysqldb_unicode:

Unicode
-------

Please see :ref:`mysql_unicode` for current recommendations on unicode
handling.

.. _mysqldb_ssl:

SSL Connections
----------------

The mysqlclient and PyMySQL DBAPIs accept an additional dictionary under the
key "ssl", which may be specified using the
:paramref:`_sa.create_engine.connect_args` dictionary::

    engine = create_engine(
        "mysql+mysqldb://scott:tiger@192.168.0.134/test",
        connect_args={
            "ssl": {
                "ca": "/home/gord/client-ssl/ca.pem",
                "cert": "/home/gord/client-ssl/client-cert.pem",
                "key": "/home/gord/client-ssl/client-key.pem",
            }
        },
    )

For convenience, the following keys may also be specified inline within the URL
where they will be interpreted into the "ssl" dictionary automatically:
"ssl_ca", "ssl_cert", "ssl_key", "ssl_capath", "ssl_cipher",
"ssl_check_hostname". An example is as follows::

    connection_uri = (
        "mysql+mysqldb://scott:tiger@192.168.0.134/test"
        "?ssl_ca=/home/gord/client-ssl/ca.pem"
        "&ssl_cert=/home/gord/client-ssl/client-cert.pem"
        "&ssl_key=/home/gord/client-ssl/client-key.pem"
    )

.. seealso::

    :ref:`pymysql_ssl` in the PyMySQL dialect


Using MySQLdb with Google Cloud SQL
-----------------------------------

Google Cloud SQL now recommends use of the MySQLdb dialect.  Connect
using a URL like the following:

.. sourcecode:: text

    mysql+mysqldb://root@/<dbname>?unix_socket=/cloudsql/<projectid>:<instancename>

Server Side Cursors
-------------------

The mysqldb dialect supports server-side cursors. See :ref:`mysql_ss_cursors`.

    N   )MySQLCompiler)MySQLDialect)MySQLExecutionContext)MySQLIdentifierPreparer)TEXT   )sql)utilc                       \ rS rSrSrg)MySQLExecutionContext_mysqldbe    N__name__
__module____qualname____firstlineno____static_attributes__r       Y/var/www/auris/envauris/lib/python3.13/site-packages/sqlalchemy/dialects/mysql/mysqldb.pyr   r   e       r   r   c                       \ rS rSrSrg)MySQLCompiler_mysqldbi   r   Nr   r   r   r   r   r   i   r   r   r   c                      ^  \ rS rSrSrSrSrSrSrSr	Sr
\r\r\rU 4S jrS r\R(                  R*                  S 5       r\S 5       rU 4S	 jrS
 rSS jrU 4S jrSS jrS rS rS r S r!U 4S jr"Sr#U =r$$ )MySQLDialect_mysqldbm   mysqldbTformatc                    > [         TU ]  " S0 UD6  U R                  bF  [        U R                  S5      (       a+  U R	                  U R                  R
                  5      U l        g SU l        g )N__version__r   r   r   r   )super__init__dbapihasattr_parse_dbapi_versionr"   _mysql_dbapi_version)selfkwargs	__class__s     r   r%   MySQLDialect_mysqldb.__init__{   s^    "6" zz%'$**m*L*L %%djj&<&<= 	!  	!r   c                     [         R                  " SU5      nU(       a#  [        S UR                  SSS5       5       5      $ g)Nz(\d+)\.(\d+)(?:\.(\d+))?c              3   @   #    U  H  oc  M  [        U5      v   M     g 7fN)int).0xs     r   	<genexpr><MySQLDialect_mysqldb._parse_dbapi_version.<locals>.<genexpr>   s     K)9AQ)9s   r      r	   r#   )rematchtuplegroup)r*   versionms      r   r(   )MySQLDialect_mysqldb._parse_dbapi_version   s7    HH0':KAq)9KKKr   c                 ~     [        S5      R                  nUR                  U l        g! [        [
        4 a     gf = f)NzMySQLdb.cursorsTF)
__import__cursorsSSCursor	_sscursorImportErrorAttributeError)r*   r@   s     r   supports_server_side_cursors1MySQLDialect_mysqldb.supports_server_side_cursors   s?    	 !23;;G$--DN^, 		s   &) <<c                     [        S5      $ )NMySQLdb)r?   )clss    r   import_dbapi!MySQLDialect_mysqldb.import_dbapi   s    )$$r   c                 2   >^ [         TU ]  5       mU4S jnU$ )Nc                    > Tb  T" U 5        U R                  5       nUb5  U R                  5       nUR                  SU-  5        UR                  5         g g )NzSET NAMES %s)character_set_namecursorexecuteclose)conncharset_namerO   super_s      r   
on_connect3MySQLDialect_mysqldb.on_connect.<locals>.on_connect   sN    !t224L'~<= (r   )r$   rU   )r*   rU   rT   r,   s     @r   rU   MySQLDialect_mysqldb.on_connect   s    #%		 r   c                 $    UR                  5         g)NT)pingr*   dbapi_connections     r   do_pingMySQLDialect_mysqldb.do_ping   s    r   c                 :    UR                  X#5      nUb  XTl        g g r0   )executemany	_rowcount)r*   rO   	statement
parameterscontextrowcounts         r   do_executemany#MySQLDialect_mysqldb.do_executemany   s#    %%i< ( r   c           	        > UR                  SU R                  R                  S5      < SU R                  R                  S5      < S35      R                  5       nU R                  S:  =(       a    UnU(       aI  [
        R                  " [
        R                  " [
        R                  " S5      [        SS	95      S
5      /nO/ n[        TU ]-  X5      $ )Nzshow collation where Charsetz = 'utf8mb4' and 	Collationz = 'utf8mb4_bin')   z'test collated returns'utf8mb4)charsetutf8mb4_bin)exec_driver_sqlidentifier_preparerquotescalarserver_version_infor
   collatecastliteral_columnr   r$   _check_unicode_returns)r*   
connection	collationhas_utf8mb4_binadditional_testsr,   s        r   rv   +MySQLDialect_mysqldb._check_unicode_returns   s    
 .. ((..y9((..{;
 &( 	 22T9GiHH**+DEY/ "   "w-jKKr   c                 z   Uc  [        SSSS9nUR                  " S0 UD6nUR                  UR                  5        [        R
                  " US[        5        [        R
                  " US[        5        [        R
                  " US[        5        [        R
                  " US[        5        [        R
                  " US	[        5        [        R
                  " US
[        5        [        R
                  " US[        5        [        R
                  " US[        5        0 nS[        4S[        4S[        4S[        4S[        4S[        4/nU H1  u  pgXc;   d  M  X6   XFSS  '   [        R
                  " XFSS  U5        X6	 M3     U(       a  XCS'   UR                  S	S5      nU R                  5       n	U	b  X-  nXS	'   / U/$ )Ndbuserpasswd)databaseusernamepasswordcompressconnect_timeoutread_timeoutwrite_timeoutclient_flaglocal_infileuse_unicoderl   ssl_cassl_keyssl_cert
ssl_capath
ssl_cipherssl_check_hostname   sslr   r   )dicttranslate_connect_argsupdatequeryr   coerce_kw_typeboolr1   strget_found_rows_client_flag)
r*   url_translate_argsoptsr   keyskeykw_typer   client_flag_found_rowss
             r   create_connect_args(MySQLDialect_mysqldb.create_connect_args   s   ""O ))<O<CIID*d3D"3S9D.#6D/37D-5D.$7 	D-6D)S1
 sO33!4(
 !LC{#yG##CQR':I	 !
 K hh}a0!%!=!=!?!-1K"-Dzr   c                     U R                   bC   [        U R                   R                  S-   5      R                  R                  nUR
                  $ g ! [        [        4 a     g f = f)Nz.constants.CLIENT)r&   r?   r   	constantsCLIENT
FOUND_ROWSrD   rC   )r*   CLIENT_FLAGSs     r   r   ,MySQLDialect_mysqldb._found_rows_client_flag   sd    ::!/)JJ''*== )FF  $... #K0 s   6A A%$A%c                      UR                   S   $ )Nr   )args)r*   	exceptions     r   _extract_error_code(MySQLDialect_mysqldb._extract_error_code  s    ~~a  r   c                      UR                   R                  nU" 5       $ ! [         a    [        R                  " S5         gf = f)z:Sniff out the character set in use for connection results.zNo 'character_set_name' can be detected with this MySQL-Python version; please upgrade to a recent version of MySQL-Python.  Assuming latin1.latin1)rw   rN   rD   r   warn)r*   rw   	cset_names      r   _detect_charset$MySQLDialect_mysqldb._detect_charset  sK    	 #--@@I ;  	II# 	s     AAc                     g)N)SERIALIZABLEzREAD UNCOMMITTEDzREAD COMMITTEDzREPEATABLE READ
AUTOCOMMITr   rZ   s     r   get_isolation_level_values/MySQLDialect_mysqldb.get_isolation_level_values   s    
r   c                 v   > US:X  a  UR                  S5        g UR                  S5        [        TU ]	  X5        g )Nr   TF)
autocommitr$   set_isolation_level)r*   r[   levelr,   s      r   r   (MySQLDialect_mysqldb.set_isolation_level)  s5    L ''-''.G'(8@r   )r)   rB   r0   )%r   r   r   r   driversupports_statement_cachesupports_unicode_statementssupports_sane_rowcountsupports_sane_multi_rowcountsupports_native_decimaldefault_paramstyler   execution_ctx_clsr   statement_compilerr   preparerr%   r(   r   langhelpersmemoized_propertyrE   classmethodrJ   rU   r\   re   rv   r   r   r   r   r   r   r   __classcell__)r,   s   @r   r   r   m   s    F#"&!#' "!5.&H
 
'' ( % % )
L61f!$
A Ar   r   )__doc__r7   baser   r   r   r   r    r
   r   r   r   r   dialectr   r   r   <module>r      sW   N` 
   ' )   	$9 		M 	AA< AAH r   