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
U
¸ý°dê&ã@s˜dZddlZddlmZddlmZddlmZddlmZddlmZd    d
lm    Z    d    d lm
Z
Gd d „d eƒZ Gdd„deƒZ Gdd„deƒZ e ZdS)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@seZdZedd„ƒZdS)ÚMySQLExecutionContext_mysqldbcCst|dƒr|jS|jjSdS)NÚ    _rowcount)Úhasattrr ÚcursorÚrowcount)Úself©rúXd:\z\workplace\vscode\pyvenv\venv\Lib\site-packages\sqlalchemy/dialects/mysql/mysqldb.pyrds
z&MySQLExecutionContext_mysqldb.rowcountN)Ú__name__Ú
__module__Ú __qualname__Úpropertyrrrrrr csr c@s eZdZdS)ÚMySQLCompiler_mysqldbN)rrrrrrrrlsrcsÈeZdZdZdZdZdZdZdZdZ    e
Z e Z eZ‡fdd„Zdd„Zejjdd    „ƒZed
d „ƒZ‡fd d „Zdd„Zd!dd„Z‡fdd„Zd"dd„Zdd„Zdd„Zdd„Zdd„Z ‡fdd „Z!‡Z"S)#ÚMySQLDialect_mysqldbZmysqldbTÚformatc s<tƒjf|Ž|jdk    r2t|jdƒr2| |jj¡nd|_dS)NÚ __version__©rrr)ÚsuperÚ__init__Údbapir Ú_parse_dbapi_versionrZ_mysql_dbapi_version)rÚkwargs©Ú    __class__rrr~sÿ
ÿýzMySQLDialect_mysqldb.__init__cCs4t d|¡}|r,tdd„| ddd¡DƒƒSdSdS)Nz(\d+)\.(\d+)(?:\.(\d+))?css|]}|dk    rt|ƒVqdS©N)Úint)Ú.0ÚxrrrÚ    <genexpr>‰sz<MySQLDialect_mysqldb._parse_dbapi_version.<locals>.<genexpr>rérr)ÚreÚmatchÚtupleÚgroup)rÚversionÚmrrrr†s z)MySQLDialect_mysqldb._parse_dbapi_versionc    Cs8ztdƒj}|j|_WdSttfk
r2YdSXdS)NzMySQLdb.cursorsTF)Ú
__import__ÚcursorsZSSCursorZ    _sscursorÚ ImportErrorÚAttributeError)rr0rrrÚsupports_server_side_cursorss 
z1MySQLDialect_mysqldb.supports_server_side_cursorscCstdƒS)NZMySQLdb)r/)ÚclsrrrÚ import_dbapi–sz!MySQLDialect_mysqldb.import_dbapicstƒ ¡‰‡fdd„}|S)NcsBˆdk    rˆ|ƒ| ¡}|dk    r>| ¡}| d|¡| ¡dS)Nz SET NAMES %s)Úcharacter_set_namerÚexecuteÚclose)ÚconnÚ charset_namer©Zsuper_rrÚ
on_connectsz3MySQLDialect_mysqldb.on_connect.<locals>.on_connect)rr<)rr<r!r;rr<šs
 zMySQLDialect_mysqldb.on_connectcCs| d¡dS)NFT)Zping©rÚdbapi_connectionrrrÚdo_pingªs
zMySQLDialect_mysqldb.do_pingNcCs| ||¡}|dk    r||_dSr#)Z executemanyr )rrZ    statementÚ
parametersÚcontextrrrrÚdo_executemany®s z#MySQLDialect_mysqldb.do_executemanycsn| d|j d¡|j d¡f¡ ¡}|jdko2|}|r\t t t d¡t    dd¡d¡g}ng}t
ƒ  ||¡S)    Nz:show collation where %s = 'utf8mb4' and %s = 'utf8mb4_bin'ÚCharsetZ    Collation)éz'test collated returns'Zutf8mb4)ÚcharsetZ utf8mb4_bin) Zexec_driver_sqlZidentifier_preparerÚquoteZscalarZserver_version_infor    ZcollateÚcastZliteral_columnrrÚ_check_unicode_returns)rÚ
connectionZ    collationZhas_utf8mb4_binZadditional_testsr!rrrH³s&
 
þÿÿþûÿ
z+MySQLDialect_mysqldb._check_unicode_returnsc
CsT|dkrtdddd}|jf|Ž}| |j¡t |dt¡t |dt¡t |dt¡t |dt¡t |d    t¡t |d
t¡t |d t¡t |d t¡i}d tfdtfdtfdtfdtfdtfg}|D]@\}}||krÎ||||dd…<t ||dd…|¡||=qÎ|r||d<|     d    d¡}| 
¡}    |    dk    rL||    O}||d    <g|gS)NÚdbÚuserÚpasswd)ZdatabaseÚusernameÚpasswordÚcompressÚconnect_timeoutÚ read_timeoutZ write_timeoutÚ client_flagZ local_infileZ use_unicoderEZssl_caZssl_keyZssl_certZ
ssl_capathZ
ssl_cipherZssl_check_hostnameéÚsslr) ÚdictZtranslate_connect_argsÚupdateÚqueryr
Zcoerce_kw_typeÚboolr$ÚstrÚgetÚ_found_rows_client_flag)
rÚurlZ_translate_argsÚoptsrTÚkeysÚkeyZkw_typerRZclient_flag_found_rowsrrrÚcreate_connect_argsÎsJÿ  ú  
z(MySQLDialect_mysqldb.create_connect_argsc    CsN|jdk    rFzt|jjdƒjj}Wnttfk
r<YdSX|jSndSdS)Nz.constants.CLIENT)rr/rÚ    constantsZCLIENTr2r1Z
FOUND_ROWS)rZ CLIENT_FLAGSrrrr[s
 
ÿ z,MySQLDialect_mysqldb._found_rows_client_flagcCs
|jdS)Nr)Úargs)rÚ    exceptionrrrÚ_extract_error_codesz(MySQLDialect_mysqldb._extract_error_codecCs8z |jj}Wn tk
r,t d¡YdSX|ƒSdS)z:Sniff out the character set in use for connection results.zNo 'character_set_name' can be detected with this MySQL-Python version; please upgrade to a recent version of MySQL-Python.  Assuming latin1.Úlatin1N)rIr6r2r
Úwarn)rrIZ    cset_namerrrÚ_detect_charsets ÿz$MySQLDialect_mysqldb._detect_charsetcCsdS)N)Z SERIALIZABLEzREAD UNCOMMITTEDzREAD COMMITTEDzREPEATABLE READÚ
AUTOCOMMITrr=rrrÚget_isolation_level_values#sz/MySQLDialect_mysqldb.get_isolation_level_valuescs0|dkr| d¡n| d¡tƒ ||¡dS)NrhTF)Z
autocommitrÚset_isolation_level)rr>Úlevelr!rrrj,s 
z(MySQLDialect_mysqldb.set_isolation_level)N)N)#rrrZdriverZsupports_statement_cacheZsupports_unicode_statementsZsupports_sane_rowcountZsupports_sane_multi_rowcountZsupports_native_decimalZdefault_paramstyler Zexecution_ctx_clsrZstatement_compilerrÚpreparerrrr
Z langhelpersZmemoized_propertyr3Ú classmethodr5r<r?rBrHr`r[rdrgrirjÚ __classcell__rrr!rrps4 
 
 
 
3     r)Ú__doc__r)ÚbaserrrrrÚr    r
r rrÚdialectrrrrÚ<module>
sN           E