操作MySQL,我们都习惯于用pymsq,基本流程就是
- 创建连接
- 创建游标
- 执行SQL
- 关闭连接
代码是这样的
import pymysql# 1.创建连接conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', password='root', charset='utf8')# 2.创建游标cursor = conn.cursor()# 3.执行sql语句cursor.execute('select * from user where xxx')result=cursor.execute(sql) #执行sql语句,返回sql查询成功的记录数目# 关闭连接,游标和连接都要关闭cursor.close()conn.close()
而今天要说的库,可以快速的进行查询,比pymysql好使,不再需要操作游标。即:records库,网上关于这个库的资料其实并不多。
什么?你没听过,所以不敢用?那你总知道requests库吧,其实这两个库都是同一个作者写的。
这个库不光支持MySQL,同样还只是PostgreSQL,SQLite,Oracle等..
项目地址:https://github.com/kennethreitz/records
安装 : pip install records mysqlclient
创建一个user_demo表
import records# 获取数据库连接db = records.Database('mysql+pymysql://root:root@localhost:3306/records_test')# 创建表的sqlcreate_sql = """CREATE TABLE IF NOT EXISTS user_demo ( id int(11) PRIMARY KEY AUTO_INCREMENT, name varchar(20), age int);"""# 执行db.query(create_sql)
获取数据库连接的格式是标准的url格式具体看下图
插入数据
对于records,插入单条和多条数据都比较方便,而且还支持动态加载数据。
# 获取数据库连接db = records.Database('mysql+pymysql://root:root@localhost:3306/records_test')# 插入一条数据db.query("INSERT INTO user_demo(name, age) VALUE ('tom', 19)")# 通过参数传值动态插入一条user = {'name': 'liming', 'age': 20}db.query("INSERT INTO user_demo(name, age) VALUE (:name, :age)", **user)# 插入多条users = [ {'name': '二狗子', 'age': 14}, {'name': '二柱子', 'age': 12}, {'name': '翠花', 'age': 9}]# records的bulk_query方法支持插入和更新多条数据db.bulk_query ("INSERT INTO user_demo(name, age) VALUES (:name, :age)", users)
执行之后,再查询数据库,发现都正常插入了;
mysql> select * from user_demo;+----+--------+------+| id | name | age |+----+--------+------+| 1 | tom | 19 || 2 | liming | 20 || 3 | 二狗子 | 14 || 4 | 二柱子 | 12 || 5 | 翠花 | 9 |+----+--------+------+5 rows in set (0.00 sec)
查询数据
records默认是返回封装的RecordCollection对象,当然我们也可以通过调整某些参数,获取到不一样的数据类型。
- as_dict = True:通过字典的形式返回数据
- as_ordereddict=True:以排序字典的形式返回数据
代码示例:
rows = db.query('select * from user_demo')# 获取全部数据print(rows.all())# 获取第一条数据print(rows.first()) # # 以字典的形式获取数据print(rows.all(as_dict=True))print(rows.first(as_dict=True))# 排序字典print(rows.first(as_ordereddict=True)) # OrderedDict([('id', 1), ('name', 'tom'), ('age', 19)])
事务
数据库事务是构成单一逻辑工作单元的操作合集,生活中最好的例子就是转账操作,A给B转账100元,先从A的账户扣除100,再给B的账户加100。如果再给B账户加100的过程程序出现异常,就会导致A莫名其妙的被扣了100。事务就是用来解决这种问题的,保证一个执行单元,要么都执行成功,要么就都不成功。
records同样也支持事务。代码如下:
with db.transaction() as t: user1 = {'name': '狗蛋', 'age': 8} user2 = {'id': 1, 'name': '锤子', 'age': 10} t.query("INSERT INTO user_demo(name, age) VALUE (:name, :age)", **user1) print("user1 已执行插入...") t.query("INSERT INTO user_demo(id,name, age) VALUE (:id,:name, :age)", **user2) print('user2 已执行插入...')
数据存中已经存在了id为1的信息,因此执行user2的时候,会导致主键冲突。 控制台输出:
user1 已执行插入...
并没有输出‘user2 已执行插入...’ 说明执行插入user2的时候出现了主键冲突(数据库中已经存在id为1的数据了)。再去查看数据库,发现并没有name为狗蛋的数据,说明这是一个数据库事务的过程。在执行user2失败的时候,将已经执行成功的user1,进行了事务回滚。
数据导出
有时候我们需要将数据库的数据进行导出,比如存成文本或者Excel。强大的records可以直接进行导出操作。
导出csv文件
rows = db.query('select * from user_demo')with open('user_demo.csv', 'wb') as f: f.write(rows.export('xlsl'))
同样可以导出yaml、json、xlsl、pandas、html等格式。导出方法为
rows.export('你要导出的格式')
例如导出Html格式:
rows = db.query('select * from user_demo')with open('user_demo.html', 'wb') as f: f.write(rows.export('html').encode('utf-8'))