Python_MySQL数据库

MySQL

MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。

安装

MySQL常用命令

以管理员身份打开cmd命令行工具,切换到你安装的mysql目录,这里是:

1
D:\Mysql\mysql-8.0.15-winx64\bin
  1. 启动:

    1
    net start mysql
  2. 登录

    1
    mysql -h 主机名 -u 用户名 -p

如果是登录本机MySQL数据库,只需要输入以下命令:

1
mysql -u root -p

接下来会让你输入登录密码:输入即可,如图所示:

启动并登录mysql数据库

参数说明·:

  • -h : 指定客户端所要登录的 MySQL 主机名(IP), 登录本机(localhost 或 127.0.0.1)该参数可以省略;
  • -u : 登录的用户名;
  • -p : 告诉服务器将会使用一个密码来登录, 如果所要登录的用户名密码为空, 可以忽略此选项。
  1. 退出和停止
1
2
3
quit;//或者 exit
...
net stop mysql
  1. 修改密码
1
mysqladmin -u用户名 -p旧密码 password 新密码
  1. 创建数据库
1
create database <数据库名>;
  1. 显示数据库
1
show databases;

注意:最后有个s

  1. 删除数据库
1
drop database <数据库名>

如图所示:

操作数据库

  1. 更多常用命令访问:MySQL常用命令大全

mysql-connector

使用 mysql-connector 来连接使用 MySQL, mysql-connector 是 MySQL 官方提供的驱动器。

安装

我们可以使用 pip 命令来安装 mysql-connector:

1
python -m pip install mysql-connector

或者直接在pycharm的setting里面安装mysql-connect包

操作
创建数据库连接
1
2
3
4
5
6
7
8
9
import mysql.connector

mydb = mysql.connector.connect(
host="localhost", # 数据库主机地址
user="username", # 数据库用户名
passwd="password" # 数据库密码
)

print(mydb)
创建数据库

创建数据库使用 “CREATE DATABASE” 语句,我们创建一个名为 first_db 的数据库:

1
2
3
4
5
6
7
8
9
10
11
import mysql.connector

mydb = mysql.connector.connect(
host="localhost",
user="root",
passwd="123456"
)

mycursor = mydb.cursor()

mycursor.execute("CREATE DATABASE first_db")
查看数据库

输出所有数据库列表:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import mysql.connector

mydb = mysql.connector.connect(
host="localhost",
user="root",
passwd="123456"
)

mycursor = mydb.cursor()

mycursor.execute("SHOW DATABASES")

for x in mycursor:
print(x)

我们可以直接连接数据库,如果数据库不存在,会输出错误信息:

1
2
3
4
5
6
7
8
import mysql.connector

mydb = mysql.connector.connect(
host="localhost",
user="root",
passwd="123456",
database="runoob_db"
)
创建数据表
1
2
3
4
5
6
7
8
9
10
11
import mysql.connector

mydb = mysql.connector.connect(
host="localhost",
user="root",
passwd="123456",
database="first_db" # 确保数据库first_db已存在
)
mycursor = mydb.cursor()

mycursor.execute("CREATE TABLE sites (name VARCHAR(255), url VARCHAR(255))")
查看数据表是否已存在:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import mysql.connector

mydb = mysql.connector.connect(
host="localhost",
user="root",
passwd="123456",
database="first_db"
)
mycursor = mydb.cursor()

mycursor.execute("SHOW TABLES")

for x in mycursor:
print(x)
主键设置

创建表的时候我们一般都会设置一个主键(PRIMARY KEY),主键起始值为 1,逐步递增。

  1. 如果我们的表已经创建,我们需要使用 ALTER TABLE 来给表添加主键:
1
2
3
4
5
6
7
8
9
10
11
12
13
给 sites 表添加主键。

import mysql.connector

mydb = mysql.connector.connect(
host="localhost",
user="root",
passwd="123456",
database="first_db"
)
mycursor = mydb.cursor()

mycursor.execute("ALTER TABLE sites ADD COLUMN id INT AUTO_INCREMENT PRIMARY KEY")
  1. 如果你还未创建 sites 表,可以直接使用以下代码创建。

给表创建主键。

1
2
3
4
5
6
7
8
9
10
11
12

import mysql.connector

mydb = mysql.connector.connect(
host="localhost",
user="root",
passwd="123456",
database="first_db"
)
mycursor = mydb.cursor()

mycursor.execute("CREATE TABLE sites (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255), url VARCHAR(255))")

插入数据
  1. 向 sites 表插入一条记录。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import mysql.connector

mydb = mysql.connector.connect(
host="localhost",
user="root",
passwd="123456",
database="first_db"
)
mycursor = mydb.cursor()

sql = "INSERT INTO sites (name, url) VALUES (%s, %s)"
val = ("RUNOOB", "https://www.runoob.com")
mycursor.execute(sql, val)

mydb.commit() # 数据表内容有更新,必须使用到该语句

print(mycursor.rowcount, "记录插入成功。")

执行代码,输出结果为:

1
1 记录插入成功

  1. 批量插入
    批量插入使用 executemany() 方法,该方法的第二个参数是一个元组列表,包含了我们要插入的数据:

向 sites 表插入多条记录。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import mysql.connector

mydb = mysql.connector.connect(
host="localhost",
user="root",
passwd="123456",
database="first_db"
)
mycursor = mydb.cursor()

sql = "INSERT INTO sites (name, url) VALUES (%s, %s)"
val = [
('Google', 'https://www.google.com'),
('Github', 'https://www.github.com'),
('Taobao', 'https://www.taobao.com'),
('stackoverflow', 'https://www.stackoverflow.com/')
]

mycursor.executemany(sql, val)

mydb.commit() # 数据表内容有更新,必须使用到该语句

print(mycursor.rowcount, "记录插入成功。")

执行代码,输出结果为:

1
2
4 记录插入成功。
`

如果我们想在数据记录插入后,获取该记录的 ID ,可以使用以下代码:

1
2
3
4
5
6
7
8
 
sql = "INSERT INTO sites (name, url) VALUES (%s, %s)"
val = ("Zhihu", "https://www.zhihu.com")
mycursor.execute(sql, val)

mydb.commit()

print("1 条记录已插入, ID:", mycursor.lastrowid)

执行代码,输出结果为:

1
1 条记录已插入, ID: 6

查询数据
  1. 查询所有数据
    1
    2
    3
    4
    5
    6
    mycursor.execute("SELECT * FROM sites")

    myresult = mycursor.fetchall() # fetchall() 获取所有记录

    for x in myresult:
    print(x)

执行代码,输出结果为:

1
2
3
4
5
6
(1, 'RUNOOB', 'https://www.runoob.com')
(2, 'Google', 'https://www.google.com')
(3, 'Github', 'https://www.github.com')
(4, 'Taobao', 'https://www.taobao.com')
(5, 'stackoverflow', 'https://www.stackoverflow.com/')
(6, 'Zhihu', 'https://www.zhihu.com')

  1. 也可以读取指定的字段数据:
    1
    2
    3
    4
    5
    6
    mycursor.execute("SELECT name, url FROM sites")

    myresult = mycursor.fetchall()

    for x in myresult:
    print(x)

执行代码,输出结果为:

1
2
3
4
5
6
('RUNOOB', 'https://www.runoob.com')
('Google', 'https://www.google.com')
('Github', 'https://www.github.com')
('Taobao', 'https://www.taobao.com')
('stackoverflow', 'https://www.stackoverflow.com/')
('Zhihu', 'https://www.zhihu.com')

  1. 如果我们只想读取一条数据,可以使用 fetchone() 方法:
    1
    2
    3
    4
    5
    mycursor.execute("SELECT * FROM sites")

    myresult = mycursor.fetchone()

    print(myresult)

执行代码,输出结果为:

1
(1, 'RUNOOB', 'https://www.runoob.com')

  1. 如果我们要读取指定条件的数据,可以使用 where 语句:
    1
    2
    3
    4
    5
    6
    7
    8
    sql = "SELECT * FROM sites WHERE name ='RUNOOB'"

    mycursor.execute(sql)

    myresult = mycursor.fetchall()

    for x in myresult:
    print(x)

执行代码,输出结果为:

1
(1, 'RUNOOB', 'https://www.runoob.com')

  1. 也可以使用通配符 %:
    1
    2
    3
    4
    5
    6
    7
    8
    sql = "SELECT * FROM sites WHERE url LIKE '%oo%'"

    mycursor.execute(sql)

    myresult = mycursor.fetchall()

    for x in myresult:
    print(x)

执行代码,输出结果为:

1
2
(1, 'RUNOOB', 'https://www.runoob.com')
(2, 'Google', 'https://www.google.com')

  1. 为了防止数据库查询发生 SQL 注入的攻击,我们可以使用 %s 占位符来转义查询的条件:
1
2
3
4
5
6
7
8
9
sql = "SELECT * FROM sites WHERE name = %s"
na = ("RUNOOB", )

mycursor.execute(sql, na)

myresult = mycursor.fetchall()

for x in myresult:
print(x)
排序

查询结果排序可以使用 ORDER BY 语句,默认的排序方式为升序,关键字为 ASC,如果要设置降序排序,可以设置关键字 DESC。

  1. 按 name 字段字母的升序排序:
    1
    2
    3
    4
    5
    6
    7
    8
    sql = "SELECT * FROM sites ORDER BY name"

    mycursor.execute(sql)

    myresult = mycursor.fetchall()

    for x in myresult:
    print(x)

执行代码,输出结果为:

1
2
3
4
5
6
(3, 'Github', 'https://www.github.com')
(2, 'Google', 'https://www.google.com')
(1, 'RUNOOB', 'https://www.runoob.com')
(5, 'stackoverflow', 'https://www.stackoverflow.com/')
(4, 'Taobao', 'https://www.taobao.com')
(6, 'Zhihu', 'https://www.zhihu.com')

  1. 降序排序实例:
    1
    2
    3
    4
    5
    6
    7
    8
    sql = "SELECT * FROM sites ORDER BY name DESC"

    mycursor.execute(sql)

    myresult = mycursor.fetchall()

    for x in myresult:
    print(x)

执行代码,输出结果为:

1
2
3
4
5
6
(6, 'Zhihu', 'https://www.zhihu.com')
(4, 'Taobao', 'https://www.taobao.com')
(5, 'stackoverflow', 'https://www.stackoverflow.com/')
(1, 'RUNOOB', 'https://www.runoob.com')
(2, 'Google', 'https://www.google.com')
(3, 'Github', 'https://www.github.com')
限制查询的数据量

指定起始位置,读取前 3 条记录.

例如,从第二条开始读取前 3 条记录:

1
2
3
4
5
6
mycursor.execute("SELECT * FROM sites LIMIT 3 OFFSET 1")  # 0 为 第一条,1 为第二条,以此类推

myresult = mycursor.fetchall()

for x in myresult:
print(x)

执行代码,输出结果为:

1
2
3
(2, 'Google', 'https://www.google.com')
(3, 'Github', 'https://www.github.com')
(4, 'Taobao', 'https://www.taobao.com')

删除记录
1
2
3
4
5
6
7
sql = "DELETE FROM sites WHERE name = 'stackoverflow'"

mycursor.execute(sql)

mydb.commit()

print(mycursor.rowcount, " 条记录删除")

执行代码,输出结果为:

1
1  条记录删除

注意:要慎重使用删除语句,删除语句要确保指定了 WHERE 条件语句,否则会导致整表数据被删除。

为了防止数据库查询发生 SQL 注入的攻击,我们可以使用 %s 占位符来转义删除语句的条件:

1
2
sql = "DELETE FROM sites WHERE name = %s"
na = ("stackoverflow", )
更新表数据
1
2
3
4
5
6
7
8
sql = "UPDATE sites SET name = 'ZH' WHERE name = 'Zhihu'"

mycursor.execute(sql)

mydb.commit()

print(mycursor.rowcount, " 条记录被修改")
执行代码,输出结果为:

使用 %s 占位符来转义更新语句的条件:

1
2
sql = "UPDATE sites SET name = %s WHERE name = %s"
val = ("Zhihu", "ZH")

删除表
1
2
3
sql = "DROP TABLE IF EXISTS sites"  # 删除数据表 sites

mycursor.execute(sql)

PyMySQL 驱动

PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库,Python2中则使用mysqldb。

PyMySQL 遵循 Python 数据库 API v2.0 规范,并包含了 pure-Python MySQL 客户端库。

安装
  1. 命令:
1
pip install PyMySQL
  1. pycharm 的setting里面安装pymysql包
操作

在操作之前确保:
1.您已经创建了数据库 TESTDB.
2.在TESTDB数据库中您已经创建了表 EMPLOYEE
3.EMPLOYEE表字段为 FIRST_NAME, LAST_NAME, AGE, SEX 和 INCOME。

数据库连接
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import pymysql

# 打开数据库连接
db = pymysql.connect("localhost","testuser","test123","TESTDB" )

# 使用 cursor() 方法创建一个游标对象 cursor
cursor = db.cursor()

# 使用 execute() 方法执行 SQL 查询
cursor.execute("SELECT VERSION()")

# 使用 fetchone() 方法获取单条数据.
data = cursor.fetchone()

print ("Database version : %s " % data)

# 关闭数据库连接
db.close()
创建数据库表
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import pymysql

# 打开数据库连接
db = pymysql.connect("localhost","testuser","test123","TESTDB" )

# 使用 cursor() 方法创建一个游标对象 cursor
cursor = db.cursor()

# 使用 execute() 方法执行 SQL,如果表存在则删除
cursor.execute("DROP TABLE IF EXISTS EMPLOYEE")

# 使用预处理语句创建表
sql = """CREATE TABLE EMPLOYEE (
FIRST_NAME CHAR(20) NOT NULL,
LAST_NAME CHAR(20),
AGE INT,
SEX CHAR(1),
INCOME FLOAT )"""

cursor.execute(sql)

# 关闭数据库连接
db.close()
插入操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 部分代码省略

# SQL 插入语句
sql = """INSERT INTO EMPLOYEE(FIRST_NAME,
LAST_NAME, AGE, SEX, INCOME)
VALUES ('Mac', 'Mohan', 20, 'M', 2000)"""
try:
# 执行sql语句
cursor.execute(sql)
# 提交到数据库执行
db.commit()
except:
# 如果发生错误则回滚
db.rollback()

# 关闭数据库连接
db.close()

也可以写成如下形式:

1
2
3
4
5
# SQL 插入语句
sql = "INSERT INTO EMPLOYEE(FIRST_NAME, \
LAST_NAME, AGE, SEX, INCOME) \
VALUES ('%s', '%s', %s, '%s', %s)" % \
('Mac', 'Mohan', 20, 'M', 2000)

查询操作

Python查询Mysql使用 fetchone() 方法获取单条数据, 使用fetchall() 方法获取多条数据。

  • fetchone(): 该方法获取下一个查询结果集。结果集是一个对象
  • fetchall(): 接收全部的返回结果行.
  • rowcount: 这是一个只读属性,并返回执行execute()方法后影响的行数。

查询EMPLOYEE表中salary(工资)字段大于1000的所有数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# SQL 查询语句
sql = "SELECT * FROM EMPLOYEE \
WHERE INCOME > %s" % (1000)
try:
# 执行SQL语句
cursor.execute(sql)
# 获取所有记录列表
results = cursor.fetchall()
for row in results:
fname = row[0]
lname = row[1]
age = row[2]
sex = row[3]
income = row[4]
# 打印结果
print ("fname=%s,lname=%s,age=%s,sex=%s,income=%s" % \
(fname, lname, age, sex, income ))
except:
print ("Error: unable to fetch data")

# 关闭数据库连接
db.close()
更新操作

将 TESTDB 表中 SEX 为 ‘M’ 的 AGE 字段递增 1:

1
sql = "UPDATE EMPLOYEE SET AGE = AGE + 1 WHERE SEX = '%c'" % ('M')
删除操作

删除数据表 EMPLOYEE 中 AGE 大于 20 的所有数据:

1
2
# SQL 删除语句
sql = "DELETE FROM EMPLOYEE WHERE AGE > %s" % (20)

你可以对我进行打赏哦