Python

第二十章 Python3 操作 MySQL

2020-01-02  本文已影响0人  热爱_生活

操作 MySQL

一、基本介绍

Python3 操作 MySQL 数据库 可以使用的模块是 pymysqlMySQLdb

这个两个模块都是通过自己的 API 执行原生的 SQL 语句实现的。

MySQLdb 是最早出现的一个操作 MySQL 数据库的模块,核心由C语言编写,接口精炼,性能最棒,缺点是环境依赖较多,安装稍复杂,近两年已停止更新,且只支持Python2.x,不支持Python3.x。

pymysql 为替代 MySQLdb 而生,纯 Python 实现,API 的接口与 MySQLdb 完全兼容,安装方便,支持Python3。

2020 已经离我们很近了,所以,我们这里只聊 pymysql

二、 安装包 pymysql

pymsql是Python中操作MySQL的模块(Linux 机器)

shell> pip3 install pymysql

三、 基本操作

1. 创建表

import pymysql

# 创建连接
conn = pymysql.connect(host='172.16.153.10',
                       port=3306,
                       user='root',
                       passwd='123', 
                       db='shark_db',
                       charset='utf8mb4')
# 获取游标对象
cursor = conn.cursor()

# 定义 sql 语句
create_table_sql = """create table t1
 (id int auto_increment primary key, 
  name varchar(10) not null, 
  age int not null)"""

# 执行 sql 语句
cursor.execute(create_table_sql)

# 提交更改
conn.commit()

# 关闭游标对象
cursor.close()

# 关闭连接对象
conn.close()

2. 插入数据

一次插入一条数据

一次插入一条数据, 并且使用变量占位符
insert_data_sql = "insert into t1(name, age) values(%s, %s);"
row = cursor.execute(insert_data_sql, ('shark', 18))

conn.commit()
cursor.close()
conn.close()

一次插入多条数据

定义插入数据的语句
many_sql = "insert into t1 (name, age) values(%s, %s)"

一次插入多条数据
row = cursor.executemany(many_sql, [('shark1', 18),('xiguatian', 20),('qf', 8)])

conn.commit()
cursor.close()
conn.close()

3. 查询数据

a. 获取到的数据是元组类型

定义一个查询语句
query_sql = "select id,name,age from t1 where name=%s;"

执行查询语句,并且返回得到结果的行数
row_nums = cursor.execute(query_sql, ('shark2'))

"""
获取到数据结果集具有迭代器的特性:
1\. 可以通过索引取值,可以切片
2\. 结果集中的数据每次取出一条就少一条
"""

获取数据中的第一条 10元
one_data = cursor.fetchone()

获取数据中的指定数量的条目  20元
many_data = cursor.fetchmany(2)

获取数据中剩余的全部数据  70元
all_data = cursor.fetchall()

cursor.close()
conn.close()
print(row_nums)
print(one_data)
print(many_data)
print(all_data)

b. 获取到的数据是字典类型的

游标设置为字典类型
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)

query_sql = "select id,name,age from t1 where name=%s;"

row_nums = cursor.execute(query_sql, ('shark2'))

获取结果的操作和之前的一样
result = cursor.fetchone()
conn.commit()
cursor.close()
conn.close()

print(result)

四、应该加入异常处理

import pymysql

# 创建连接
conn = pymysql.connect(host='172.16.153.10',
                       port=3306,
                       user='root',
                       passwd='123', 
                       db='shark_db')

# 创建游标
cursor = conn.cursor()

try:
    cursor.executemany("INSERT INTO para5(name,age) VALUES(%s,%s);", [('次牛444', '12'), ("次牛2", '11'), ('次牛3', '10')])
    conn.commit()
except Exception as e:
    # 如果执行sql语句出现问题,则执行回滚操作
    conn.rollback()
    print(e)
finally:
    # 不论try中的代码是否抛出异常,
    # 这里都会执行关闭游标和数据库连接
    cursor.close()
    conn.close()

五、 获取新增数据的自增 ID

# 先连接
cursor = conn.cursor()
cursor.executemany("insert into student(name,age, phone)values(%s,%s, %s)",
                   [ ("superman5110",18, '13295686769')]   )
conn.commit()
cursor.close()
conn.close()

# 获取最新自增ID
new_id = cursor.lastrowid

6. 操作存储过程(扩展)

无参数存储过程

cursor.callproc('p1')  #等价于cursor.execute("call p1()")

有参存储过程

cursor.callproc('p2', args=(1, 22, 3, 4))

#获取执行完存储的参数,参数@开头
cursor.execute("select @p2,@_p2_1,@_p2_2,@_p2_3")  #{'@_p2_1': 22, '@p2': None, '@_p2_2': 103, '@_p2_3': 24}

row_1 = cursor.fetchone()

上一篇下一篇

猜你喜欢

热点阅读