前言:
python 中常用的连接 mysql 的包有两个 MySQLdb 和 pymysql,用法大致相同,这里只介绍 pymysql 用法。
1.安装
pip install pymysql
2.获取连接
import pymysql
# 连接database
conn = pymysql.connect(
host=“你的数据库地址”,
user=“用户名”,password=“密码”,
database=“数据库名”,
charset=“utf8”)
# 得到一个可以执行SQL语句的光标对象
cursor = conn.cursor() # 默认执行完毕返回的结果集默认以元组显示
# 也可以指定返回类型为字典,如下
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
3.数据操作
增删改查中,增删改在执行sql语句以后一定要提交,查询不需要提交,如下:
# 查询
sql = "select * from table where id='999'"
# count 是满足查询条件的信息数量
count = cursor.execute(sql)
# 获取查询数据有三种方式,返回结果是按照查询顺序排列的元祖
info = cursor.fetchall() # 获取全部数据
info = cursor.fetchone() # 获取第一条数据
info = cursor.fetchmany(num) # 获取前 num 条数据
插入数据单独说一下,主要是有单条数据插入,和多条数据插入的不同
# 插入一条数据
sql = "insert into db(id,name,age) values('1','qingquan','25')"
result = cursor.execute(sql)
# 一定要有下面这句提交语句,不然插入数据不生效
conn.commit()
# 插入多条语句
sql = "insert into db(id,name,age) values('%s','%s','%s')"
# data 是 list,,每个成员是 tuple
data = {
('1','quan','25'),
('2','qing','25'),
}
result = cursor.executemany(sql , data)
conn.commit()
删除和修改数据和插入一条数据除了 sql 语句不一样,其他都是同样的操作
4.其他操作notes
1.获取插入数据最后一条的自增 id
# 在有自增 id 的表中,可以在插入数据提交以后,使用下面函数获取最后一条数据的自增 id
last_id = cursor.lastrowid
2.防 sql 注入攻击
# 大部分时候我们使用下面方式构建 sql 语句
sql = "select * from test_db where id = '%s'" % ('1',)
# pymysql 有一个 sql 语句防注入的构建模式
sql = cursor.mogrify( "select * from test_db where id = '%s'", ('1',))
3.事务回滚
事务由作为一个单独单元的一个或多个SQL语句组成,如果其中一个语句不能完成,整个单元就会回滚(撤销),所有影响到的数据将返回到事务开始以前的状态。因而,只有事务中的所有语句都成功地执行才能说这个事务被成功地执行。
conn.rollback()
3.为了防止数据操作过程中报错,可以使用 try…except…finally的结构
5.关闭数据库连接
如果数据库操作完成一定要记得把连接关掉,这样可以减轻 mysql 的连接负载
# 先关游标
cursor.close()
# 再关连接
conn.close()
6.完整例子
def mysql_operation(name, age):
conn = pymysql.connect(host='', port=3306, user='', password='', db='')
cursor = conn.cursor()
insert_sql = "insert into test_db(name,age) values('%s','%s')" % (name, age)
try:
select_sql = cursor.mogrify("select * from test_db where name = '%s'", (name,))
count = cursor.execute(select_sql )
if response >= 1:
print(u'已存在...')
else:
try:
cursor.execute(insert_sql)
conn.commit()
print(u'更新成功...')
except Exception as e:
print(u'更新错误...', e)
conn.rollback()
except Exception as e:
print(u'查询错误...', e)
conn.rollback()
finally:
cursor.close()
conn.close()