文章目录
- 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 是 及以上版本,密码插件验证方式发生了变化,早期版本为
mysql_native_password
, 版本为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")
- 如果不存在
my.ini
文件,则新建一个同名文件。 ↩︎