在上一篇《Python中的SQL库:SQLite》中,已经对数据库的基本操作有所概括,并且用SQLite做了演示。本文将重点介绍在Python程序中如何操作MySQL。
本文中所用的数据库,其基本结构与上一篇文章相同,此处不再赘述。
连接数据库
对于MySQL而言,与SQLite不同之处在于Python中没有内置的模块,如果要连接MySQL数据库,需要安装第三方的模块。这方面的模块比较多,比如本文使用的mysql-connector-python
只是其中之一。
首先,要安装这个模块。
代码语言:javascript复制pip install mysql-connector-python
然后,编写创建连接MySQL的函数:
代码语言:javascript复制import mysql.connector
from mysql.connector import Error
def create_connection(host_name, user_name, user_password):
connection = None
try:
connection = mysql.connector.connect(
host=host_name,
user=user_name,
passwd=user_password
)
print('Connection to MySQL DB successful')
except Error as e:
print(f"The error '{e}' occurred.")
return connection
connection = create_connection("localhost", 'root', "12345678")
上面的函数汇总,有三个需要提供的参数:
host_name
:MySQL服务的远程地址,如果是使用的本地服务,则可以写成localhost
user_name
:登录MySQL的用户名,本例中直接使用root
user_password
:即root
对应的密码
通过上述参数,利用mysql.connector.connect()
函数建立起数据库连接,并且返回连接对象。
然后,可以创建数据库,为此编写如下函数:
代码语言:javascript复制def create_database(connection, query):
cursor = connection.cursor()
try:
cursor.execute(query)
print("Database create successfully")
except Error as e:
print(f"The error '{e}' occurred.")
create_database_query = "CREATE DATABASE readers"
create_database(connection, create_database_query)
函数create_database
的参数connection
是前面已经创建的连接对象,query
是SQL语句,利用游标对象的execute
方法执行SQL语句。如此,创建了名为readers
的MySQL数据库。
然后,重写create_connection
函数,在其中指定所要连接的具体数据库。
import mysql.connector
from mysql.connector import Error
def create_connection(host_name, user_name, user_password, db_name):
connection = None
try:
connection = mysql.connector.connect(
host=host_name,
user=user_name,
passwd=user_password,
database=db_name
)
print('Connection to MySQL DB successful')
except Error as e:
print(f"The error '{e}' occurred.")
return connection
connection = create_connection("localhost", 'root', "12345678", 'readers')
这样,就得到了链接数据库readers
的连接对象connection
。
创建数据库表
前面已经看到,要在Python中执行各种SQL语句,需要通过cursor.execute()
函数。下面就创建一个专门的函数,来完成各种SQL语句的操作。
def execute_query(connection, query):
cursor = connection.cursor()
try:
cursor.execute(query)
connection.commit()
print("Query executed successfully")
except Error as e:
print(f"The error '{e}' occurred")
这个函数完成的,其实是所有针对数据库的“写入”操作。
例如,如下是创建users
表的SQL语句:
create_users_table = """
CREATE TABLE IF NOT EXISTS users(
id INT AUTO_INCREMENT,
name TEXT NOT NULL,
age INT,
gender TEXT,
PRIMARY KEY (id)
) ENGINE = InnoDB
"""
通过此语句,将创建users
数据库表,其中包括的字段有:id, name, age, gender
,然后用下面的方式,调用函数:
execute_query(connection, create_users_table)
如此,即创建了users
数据库表,并具有前述个字段。
同样方法,编写创建posts
表的SQL语句字符串:
create_posts_table = """
CREATE TABLE IF NOT EXISTS posts (
id INT AUTO_INCREMENT,
title TEXT NOT NULL,
description TEXT NOT NULL,
user_id INTEGER NOT NULL,
FOREIGN KEY fk_user_id (user_id) REFERENCES users(id),
PRIMARY KEY (id)
) ENGINE = InnoDB
"""
execute_query(connection, create_posts_table)
在上一篇中已经说过,users
和posts
两张表之间是一对多的关系,在posts
表中就增加了一个名为user_id
的字段作为外键,它的值与users
表中的id
字段值对应。
以上操作,与上一篇中SQLite操作类似。
插入
插入记录,当然也是“写入”操作,继续使用前面已经编写的execute_query()
函数,我们需要做的就是编写INSERT INTO
语句。例如:
insert_users = """
INSERT INTO
`users` (`name`, `age`, `gender`)
VALUES
('zhagnsan',23,'male'),
('lisi',24,'female'),
('wangwu',25,'male');
"""
execute_query(connection, insert_users)
上述操作是向users
表中增加几条用户记录。
在前面的execute_query()
函数中,使用的是游标对象的execute
方法,此外,还有另外一个方法,在写入多条记录的时候,速度更快,如下所示:
sql = "INSERT INTO likes ( user_id, post_id ) VALUES ( %s, %s )"
val = [(4, 5), (3, 4)]
cursor = connection.cursor()
cursor.executemany(sql, val)
connection.commit()
查询
查询,即“读”的操作,与上一篇的中所写的函数一样。
代码语言:javascript复制def execute_read_query(connection, query):
cursor = connection.cursor()
result = None
try:
cursor.execute(query)
result = cursor.fetchall()
return result
except Error as e:
print(f"The error '{e}' occurred")
select_users = "SELECT * FROM users"
users = execute_read_query(connection, select_users)
for user in users:
print(user)
返回结果如下:
代码语言:javascript复制(1, 'zhagnsan', 23, 'male')
(2, 'lisi', 24, 'female')
(3, 'wangwu', 25, 'male')
更新
对数据库的update,显然是一种“写入”操作,因此,前面编写的execute_query
函数对于更新操作依然有效。
update_post_description = """
UPDATE
posts
SET
description = "The weather has become pleasant now"
WHERE
id = 2
"""
execute_query(connection, update_post_description)
如果再用前面的方法进行查询,就可以看到更新之后的结果了。
删除
执行删除操作的SQL语句,可以通过前面所创建的execute_query()
函数完成。
delete_comment = "DELETE FROM comments WHERE id = 2"
execute_query(connection, delete_comment)
以上演示了在Python程序中对MySQL数据库的各项操作,基本上与上一篇中SQLite的操作类似。其实,其他关系型数据库,操作都是如此进行。