文章目录

  • 1 问题
  • 2. 解决方案
  • 3. 讨论



1 问题

你需要使用 Python 建立和数据库服务器的连接,同时在完成对数据库的操作之后断开连接。

2. 解决方案

需要使用 mysql-connector 来连接使用 MySQL, mysql-connector 是 MySQL 官方提供的驱动器。使用 pip 命令来安装 mysql-connector

python -m pip install mysql-connector

接着,通过执行下列语句可验证驱动是否安装成功:

import mysql.connector

执行以上代码,如果没有产生错误,表明安装成功。

注意:如果你的 MySQL 是 python mq断线重连 python断开数据库连接_python mq断线重连 及以上版本,密码插件验证方式发生了变化,早期版本为 mysql_native_passwordpython mq断线重连 python断开数据库连接_python mq断线重连 版本为 caching_sha2_password,所以需要另外做一些配置改变:

先修改 my.ini 配置1

[mysqld] default_authentication_plugin=mysql_native_password

接着修改用户密码的验证方式,下面操作需要使用 root 用户或者至少具有 CREATE USER 权限的用户:

ALTER USER 'cbuser'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

3. 讨论

使用 mysql-connector 驱动连接数据库也很简单,只要导入模块 mysql.connector ,然后调用其中的 connect() 方法并传递对应参数即可:

#!/usr/bin/python
# connect.py: connect to the MySQL server
import mysql.connector

try:
    conn = mysql.connector.connect(database="cookbook",
                                   host="localhost",
                                   user="cbuser",
                                   password="password")
    print("Connected")
except:
    print("Cannot connect to server")
else:
    conn.close()
    print("Disconnected")

执行上述代码之后的结果应该如下:

Connected
Disconnected

上述 connect.py 脚本中,import 行告诉 Python 导入 mysql.connector 模块,然后尝试调用模块中的 connect() 函数建立连接以获得一个连接对象,然后由变量 conn 引用该对象。

如果 connect() 函数调用失败,那么 mysql.connector 模块或 Python 本身会抛出异常。为了处理可能的异常,将可能产生异常的语句放在 try 语句中,并且在 except 语句中包含异常处理的代码。

else 语句中包含了在 try 语句执行结束且未抛出异常情况下需要执行的代码,这里 else 部分包含的代码用于关闭成功打开的链接。

由于 connect() 函数使用命名参数,因此参数的顺序不影响函数的执行,而且即使你不指定 host 参数,那么底层会默认使用 127.0.0.1 作为 host 的实参,除此之外,对于 connect() 函数接收的其他命令参数,在 mysql.connector 模块的 constants.py 文件下也都有默认参数设置:

DEFAULT_CONFIGURATION = {
    'database': None,
    'user': '',
    'password': '',
    'password1': '',
    'password2': '',
    'password3': '',
    'host': '127.0.0.1',
    'port': 3306,
    'unix_socket': None,
    'use_unicode': True,
    'charset': 'utf8mb4',
    'collation': None,
    'converter_class': None,
    'converter_str_fallback': False,
    'autocommit': False,
    'time_zone': None,
    'sql_mode': None,
    'get_warnings': False,
    'raise_on_warnings': False,
    'connection_timeout': None,
    'client_flags': 0,
    'compress': False,
    'buffered': False,
    'raw': False,
    'ssl_ca': None,
    'ssl_cert': None,
    'ssl_key': None,
    'ssl_verify_cert': False,
    'ssl_verify_identity': False,
    'ssl_cipher': None,
    'tls_ciphersuites': None,
    'ssl_disabled': False,
    'tls_versions': None,
    'passwd': None,
    'db': None,
    'connect_timeout': None,
    'dsn': None,
    'force_ipv6': False,
    'auth_plugin': None,
    'allow_local_infile': False,
    'allow_local_infile_in_path': None,
    'consume_results': False,
    'conn_attrs': None,
    'dns_srv': False,
    'use_pure': False,
    'krb_service_principal': None,
    'oci_config_file': None
}

建立连接的另一个方式是使用一个 Python 字典来指定连接参数,然后将该字典传递给 connect() 函数:

#!/usr/bin/python
# connect.py: connect to the MySQL server
import mysql.connector

try:
    conn_params = {
        "database": "cookbook",
        "host": "localhost",
        "user": "cbuser",
        "password": "password", }
    conn = mysql.connector.connect(**conn_params)
    print("Connected")	
except:
    print("Cannot connect to server")
else:
    conn.close()
    print("Disconnected")

  1. 如果不存在 my.ini 文件,则新建一个同名文件。 ↩︎