小编说:人生苦短,我用Python,使用Python可以操作各种主流的数据库,本文作者李刚,带你快速入门用Python操作MySQL数据库。
安装MySQL数据库模块
安装模块使用如下命令:
代码语言:javascript复制pip install packagename
在命令行窗口中输入如下命令:
代码语言:javascript复制pip install mysql-connector-python
运行该命令将可看到程序下载、并安装mysql-connector-python模块的过程,最后会生成如下一条提示信息。
代码语言:javascript复制Successfully installed mysql-connector-python-8.0.11
上面信息提示该模块安装成功。
如果希望指定安装不同版本的模块,也可指定版本号。例如:
代码语言:javascript复制pip install packagename ==1.0.4 # 安装指定版本
提示:除了使用MySQL官方提供的Python模块来连接MySQL数据库之外,还有一个广泛使用的连接MySQL的模块:MySQL-python,其官方站点为:https://pypi.org/project/MySQL-python/。
执行DDL语句
在使用mysql-connector-python模块操作MySQL数据库之前,同样先检查一下该模块的全局属性。
代码语言:javascript复制>>> import mysql.connector
>>> mysql.connector.apilevel
'2.0'
>>> mysql.connector.paramstyle
'pyformat'
>>>
从上面输出可以看到,mysql-connector数据库模块同样遵守DB API 2.0规范,且该模块允许在SQL语句中使用扩展的格式代码(pyformat)来代表参数。
使用MySQL模块向MySQL数据库执行DDL语句与使用SQLite模块向SQLite执行DDL语句并没有太大的区别,需要注意的区别在于:MySQL数据库有服务器进程、默认通过3306端口对外提供服务,因此Python程序连接MySQL数据库时可指定远程服务器IP地址和端口,如果不指定服务器IP地址和端口,则使用默认服务器IP地址:localhost和默认端口:3306。
下面程序示范了如何连接MySQL数据库,并通过DDL语句来创建2个数据表。
代码语言:javascript复制# 导入访问MySQL的模块
import mysql.connector
# ①、连接数据库
conn = mysql.connector.connect(user='root', password='32147',
host='localhost', port='3306',
database='python', use_unicode=True)
# ②、获取游标
c = conn.cursor()
# ③、执行DDL语句创建数据表
c.execute('''create table user_tb(
user_id int primary key auto_increment,
name varchar(255),
pass varchar(255),
gender varchar(255))''')
# 执行DDL语句创建数据表
c.execute('''create table order_tb(
order_id integer primary key auto_increment,
item_name varchar(255),
item_price double,
item_number double,
user_id int,
foreign key(user_id) references user_tb(user_id) )''')
# ④、关闭游标
c.close()
# ⑤、关闭连接
conn.close()
上面程序最大的关键就在于第5、6、7行代码:程序要连接localhost主机上3306端口服务的python数据库,因此该程序要求必须先在本机的MySQL数据库服务器上创建一个python数据库。
通过开始菜单的“MySQL → MySQL Server 8.0 → MySQL 8.0 Command Line Client - Unicode”启动MySQL的命令行客户端,输入root账户的密码即可进入MySQL的命令行客户端,然后在该客户端中输入如下命令来创建python数据库。
代码语言:javascript复制create database python;
接下来运行上面程序,程序运行结束后将可以看到python数据库中多了2个数据表。如图1所示。
图1 创建数据表
上面程序中①、②、③、④、⑤步的步骤就是Python连接数据库的固定步骤,几乎连接所有数据库大致都是这样几步,程序在第③步执行了2次,每次分别执行一条create语句,因此该程序执行完成后将会看到当前数据库中包含2个数据表:user_tb和order_tb,且order_tb中有个外键列引用user_tb表的user_id主键列。
需要指出的是,此处程序使用execute()方法执行的create语句与前面操作SQLite数据库所使用的create语句略有差异,但这个差异是两个数据库本身所引起的,与Python程序并没有任何关系。
如果当Python程序提示某条SQL语句有语法错误时,最好先利用此处介绍的MySQL客户端先测试这条语句,以保证这条SQL语句的语法正确。
提示:同一条SQL语句,在有的数据库上可能是可以成功的,但在其他数据库上可能会失败,这是由于不同数据库之间虽然大体是相同的,但在实现细节上略有差异。
执行DML语句
与使用SQLite数据库模块类似,MySQL数据库模块同样可使用游标的execute()方法也可执行DML语句的insert、update、delete语句,这样即可向数据库插入、修改和删除数据。
例如如下程序示范了向数据库的两个数据表分别插入一条数据。
代码语言:javascript复制# 导入访问MySQL的模块
import mysql.connector
# ①、连接数据库
conn = mysql.connector.connect(user='root', password='32147',
host='localhost', port='3306',
database='python', use_unicode=True)
# ②、获取游标
c = conn.cursor()
# ③、调用执行insert语句插入数据
c.execute('insert into user_tb values(null, %s, %s, %s)',
('孙悟空', '123456', 'male'))
c.execute('insert into order_tb values(null, %s, %s, %s, %s)',
('鼠标', '34.2', '3', 1))
conn.commit()
# ④、关闭游标
c.close()
# ⑤、关闭连接
conn.close()
上面程序第11和第13代码分别用于向user_tb、order_tb表中插入数据记录,注意该程序的SQL语句中的占位符:%s,这正如mysql.connector.paramstyle属性所标识的:pyformat,它指定在SQL语句中使用扩展的格式代码来作为占位符。
运行上面程序之后就会向两个python数据库的两个数据表各插入一条记录。打开MySQL的命令行客户端可如图2所示的数据。
图2 执行insert语句插入数据
与SQLite数据模块类似的是,MySQL数据库模块同样支持使用executemany()方法重复执行一条SQL语句。例如如下程序。
代码语言:javascript复制# 导入访问MySQL的模块
import mysql.connector
# ①、连接数据库
conn = mysql.connector.connect(user='root', password='32147',
host='localhost', port='3306',
database='python', use_unicode=True)
# ②、获取游标
c = conn.cursor()
# ③、调用executemany()方法把同一条SQL语句执行多次
c.executemany('insert into user_tb values(null, %s, %s, %s)',
(('sun', '123456', 'male'),
('bai', '123456', 'female'),
('zhu', '123456', 'male'),
('niu', '123456', 'male'),
('tang', '123456', 'male')))
conn.commit()
# ④、关闭游标
c.close()
# ⑤、关闭连接
conn.close()
该程序与前面使用SQLite数据模块重复执行SQL语句的程序基本相同,只是该程序在SQL语句中使用%s作为占位符。
使用MySQL数据库模块中游标的executemany()方法同样可重复执行update、delete语句,这完全是允许的。
需要说明是,MySQL数据库模块的连接对象有一个autocommit属性,如果将该属性设为True,那意味着关闭该连接的事务支持,程序每次执行DML语句之后都会自动提交,这样程序就无需调用连接对象的commit()方法来提交事务。例如如下程序。
代码语言:javascript复制# 导入访问MySQL的模块
import mysql.connector
# ①、连接数据库
conn = mysql.connector.connect(user='root', password='32147',
host='localhost', port='3306',
database='python', use_unicode=True)
# 将autocommit设置True,关闭事务
conn.autocommit = True
# 下面执行的DML语句会自动提交
...
# ④、关闭游标
c.close()
# ⑤、关闭连接
conn.close()
上面程序中将连接对象的autocommit设为True,这意味着该连接将会自动提交每条DML语句,这就相当于关闭了事务,所以程序也不需要调用连接对象的commit()方法来提交事务。