操作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')
# 创建表的sql
create_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()) # <Record {"id": 1, "name": "tom", "age": 19}>
# 以字典的形式获取数据
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'))
以上,便是今天的分享,希望大家喜欢
感谢您的阅读