操作MySQL?这个库比pymysql香一百倍

640?wx_fmt=jpeg

操作MySQL,我们都习惯于用pymsq,基本流程就是

  1. 创建连接

  2. 创建游标
  3. 执行SQL
  4. 关闭连接

代码是这样的
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格式具体看下图

640?wx_fmt=png

插入数据

对于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'))

640?wx_fmt=png

同样可以导出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'))


以上,便是今天的分享,希望大家喜欢,觉得内容不错的,欢迎点击「在看」支持,谢谢各位。

640?

感谢您的阅读

640?wx_fmt=gif


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值