
    -h0'                         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::

    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 5       rSrg)MySQLExecutionContext_mysqldba   c                 h    [        U S5      (       a  U R                  $ U R                  R                  $ )N	_rowcount)hasattrr   cursorrowcount)selfs    vC:\Users\ROHAN GUPTA\OneDrive\Desktop\mathbuddy-assessment\venv\Lib\site-packages\sqlalchemy/dialects/mysql/mysqldb.pyr   &MySQLExecutionContext_mysqldb.rowcountb   s)    4%%>>!;;'''     N)__name__
__module____qualname____firstlineno__propertyr   __static_attributes__r   r   r   r   r   a   s    ( (r   r   c                       \ rS rSrSrg)MySQLCompiler_mysqldbj   r   N)r   r   r   r   r   r   r   r   r    r    j   s    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 rSS jrU 4S jrSS jrS rS r S r!\"" / SQ5      r#U 4S jr$Sr%U =r&$ )MySQLDialect_mysqldbn   mysqldbTformatc                    > [         [        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   )superr#   __init__dbapir   _parse_dbapi_versionr(   _mysql_dbapi_version)r   kwargs	__class__s     r   r+   MySQLDialect_mysqldb.__init__|   sa    "D2<V< 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   rD   s     r   supports_server_side_cursors1MySQLDialect_mysqldb.supports_server_side_cursors   s?    	 !23;;G$--DN^, 		s   &) <<c                     [        S5      $ )NMySQLdb)rC   )clss    r   r,   MySQLDialect_mysqldb.dbapi   s    )$$r   c                 :   >^ [         [        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_namer   executeclose)conncharset_namer   super_s      r   
on_connect3MySQLDialect_mysqldb.on_connect.<locals>.on_connect   sN    !t224L'~<= (r   )r*   r#   rW   )r   rW   rV   r0   s     @r   rW   MySQLDialect_mysqldb.on_connect   s     +T=?		 r   c                 "    UR                  5       $ r4   )ping)r   dbapi_connections     r   
_ping_implMySQLDialect_mysqldb._ping_impl   s    $$&&r   c                      U R                  U5        g! U R                  R                   a"  nU R                  X!S 5      (       a   S nAge S nAff = f)NTF)r]   r,   Erroris_disconnect)r   r\   errs      r   do_pingMySQLDialect_mysqldb.do_ping   sN    	OO,-  zz 	!!#>>		s    AA
AAc                 :    UR                  X#5      nUb  XTl        g g r4   )executemanyr   )r   r   	statement
parameterscontextr   s         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[        [        U ]3  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*   r#   _check_unicode_returns)r   
connection	collationhas_utf8mb4_binadditional_testsr0   s        r   r{   +MySQLDialect_mysqldb._check_unicode_returns   s    
 .. ((..y9((..{;
 &( 	 22T9GiHH**+DEY/ "   ")4G
 	
r   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_unicoderq   ssl_cassl_keyssl_cert
ssl_capath
ssl_cipherssl_check_hostname   sslr   r   )dicttranslate_connect_argsupdatequeryr   coerce_kw_typeboolr5   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.#6 	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,   rC   r   	constantsCLIENT
FOUND_ROWSrH   rG   )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)r|   rQ   rH   r   warn)r   r|   	cset_names      r   _detect_charset$MySQLDialect_mysqldb._detect_charset  sK    	 #--@@I ;  	II# 	s     AA)SERIALIZABLEzREAD UNCOMMITTEDzREAD COMMITTEDzREPEATABLE READ
AUTOCOMMITc                 ~   > US:X  a  UR                  S5        g UR                  S5        [        [        U ]  X5        g )Nr   TF)
autocommitr*   r#   _set_isolation_level)r   r|   levelr0   s      r   r   )MySQLDialect_mysqldb._set_isolation_level7  s:    L !!$'!!%(&Br   )r.   rF   r4   )'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_propertyrI   classmethodr,   rW   r]   rc   rj   r{   r   r   r   r   set_isolation_lookupr   r   __classcell__)r0   s   @r   r#   r#   n   s    F#"&!#' "!5.&H
 
'' ( % % '	)

:1f!$ 	
 r   r#   )__doc__r;   baser   r   r   r   r    r
   r   r   r    r#   dialectr   r   r   <module>r      sU   L\ 
   ' )   ($9 (	M 	P< Pf r   