本文所有的实验基于mysql的python数据库里的test表(估计给数据库起名为python的人也就只有我了),test表结构如下:
常规操作
可以把connection理解成一个事务,事务的最终有两种操作:提交connection.commit()和回滚connection.rollback()
import pymysql
import time
# 连接数据库
connection = pymysql.connect(host='127.0.0.1',
port=3306,
database='python',
user='root',
password='root',
charset='utf8')
try:
with connection.cursor() as cursor:
sql = "insert into test(str, num, time) values(%s, %s, %s)" # 插入整数也用%s
for i in range(10):
cursor.execute(sql, ('hello,world', i, time.strftime('%y-%m-%d %H-%M-%S'))) # 这里给的整数i
connection.commit() # 提交数据库添加操作
with connection.cursor() as cursor:
sql = "select id, str from test where num > %s"
cursor.execute(sql, (3,))
# 每次取结果集,cursor将会向后移动
print(cursor.fetchone()) # 取一行结果集
print(cursor.fetchmany(2)) # 取若干行
print(cursor.fetchall()) # 取所有行
except Exception as e:
print(e)
print('数据库操作发生异常')
connection.rollback()
else:
print('数据库操作成功')
finally:
connection.close()
关于其他的一些东西
1. 每次调用execute()后都会返回受影响的行数,同样可以通过cursor.rowcount进行获取
2. fetch()默认以元组的形式返回查询结果,可以在创建cursor的时候传入参数,设置fetch()的查询结果以字典的形式返回,这样就可以在查询结果里,根据key来索引value了
cursor = connection.cursor(cursor=pymysql.cursors.DictCursor)