pymysql 操作 mysql 样例

前言:

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()
7.参考资料

pymysql操作mysql详解
对mysql事务提交、回滚的错误理解

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章