30分钟入门Python操作MySQL

2020-06-12 16:31:18 浏览数 (1)

小编说:人生苦短,我用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()方法来提交事务。

0 人点赞