你说什么都对

  • 首页
  • 技术
  • 工具分享
  1. 首页
  2. 技术
  3. Python
  4. 正文

python records 连接数据库

2022年11月3日 129点热度 0人点赞 0条评论

Records是Kenneth Reitz for Humans™系列继requests后的又一大作,官方描述为只需编写SQL,其他交给Records,它使得工作流程尽可能简单,同时提供一个优雅的方式处理查询结果。

官方网站: https://github.com/kennethreitz/records

连接数据库

>>> import records
>>> db = records.Database('sqlite:///test.db')

Records使用sqlalchemy的create_engine,DBAPI可以完全参照sqlalchemy文档,如下示例列出了连接PostgreSQL,MySQL,Oracle,Microsoft SQL Server, SQLite的DBAPI:
注:DBAPI是符合RFC 1738 Uniform Resource Locators (URL)定义的一种数据库连接方式

"""PostgreSQL"""
# default
db = records.Database('postgresql://scott:tiger@localhost/mydatabase')
# psycopg2
db = records.Database('postgresql+psycopg2://scott:tiger@localhost/mydatabase')
# pg8000
db = records.Database('postgresql+pg8000://scott:tiger@localhost/mydatabase')

"""MySQL"""
# default
db = records.Database('mysql://scott:tiger@localhost/foo')
# mysqlclient (a maintained fork of MySQL-Python)
db = records.Database('mysql+mysqldb://scott:tiger@localhost/foo')
# PyMySQL
db = records.Database('mysql+pymysql://scott:tiger@localhost/foo')

"""Oracle"""
db = records.Database('oracle://scott:tiger@127.0.0.1:1521/sidname')
db = records.Database('oracle+cx_oracle://scott:tiger@tnsname')

"""Microsoft SQL Server"""
# pyodbc
db = records.Database('mssql+pyodbc://scott:tiger@mydsn')
# pymssql
db = records.Database('mssql+pymssql://scott:tiger@hostname:port/dbname')

"""SQLite"""
# for a relative file path
db = records.Database('sqlite:///foo.db')
# for a absolute file path 
# UNIX/MAC
db = records.Database('sqlite:////absolute/path/to/foo.db')
# Windows
db = records.Database('sqlite:///C:\\path\\to\\foo.db')
# Windows using raw string
db = records.Database(r'sqlite:///C:\path\to\foo.db')
# for a memory database
db = records.Database('sqlite://')

查询

Records可以方便的使用SQL语句来查询数据,通过调用query方法,对返回的结果,我们无需过多处理,就可以方便的使用。

>>> rows = db.query('SELECT * FROM users')

对于查询语句来说,Records返回的是一个Record对象或Record对象的一个列表。我们可以调用Record对象内置方法,比如:

as_dict() 作为一个字典返回。

as_dict(ordered=True) 作为一个OrderedDict返回。

我们还可以像操作字典一样去操作Record对象,比如使用keys()和values()

# 处理单条数据
>>> rows[0]
<Record {"id": 1, "name": "\u5f20\u4e09", "age": "27", "city": "\u5357\u4eac"}>
>>> rows[0].as_dict()
{'id': 1, 'name': '张三', 'age': '27', 'city': '南京'}
>>> rows[0].name
'张三'
>>> rows[0].get('city')
'南京'
# 处理多条数据
>>> rows.all()
[<Record {"id": 1, "name": "\u5f20\u4e09", "age": "27", "city": "\u5357\u4eac"}>, <Record {"id": 2, "name": "\u674e\u56db", "age": "32", "city": "\u6df1\u5733"}>, <Record {"id": 3, "name": "\u738b\u4e94", "age": "27", "city": "\u4e0a\u6d77"}>, <Record {"id": 4, "name": "\u5f20\u4e09", "age": "27", "city": "\u5317\u4eac"}>]

>>> rows.as_dict()
[{'id': 1, 'name': '张三', 'age': '27', 'city': '南京'}, {'id': 2, 'name': '李四', 'age': '32', 'city': '深圳'}, {'id': 3, 'name': '王五', 'age': '27', 'city': '上海'}, {'id': 4, 'name': '张三', 'age': '27', 'city': '北京'}]

我们也可以像处理任何可迭代对象一样使用循环来遍历每一行数据。

# 循环数据集
>>> for row in rows:
        print(row.name, row.city)

张三 南京
李四 深圳
王五 上海
张三 北京

Records使用tablib来处理数据导出,tablib是一个纯Python编写的格式无关的表格数据处理库,使用tablib我们可以方便的将Records对象导出成下列格式:

  • Excel (Sets + Books)
  • JSON (Sets + Books)
  • YAML (Sets + Books)
  • Pandas DataFrames (Sets)
  • HTML (Sets)
  • Jira (Sets)
  • TSV (Sets)
  • ODS (Sets)
  • CSV (Sets)
  • DBF (Sets)

在Records类中,内置了一个dataset属性,用来生成一个tablib的Dataset对象,也提供了一个export方法,可以将Dataset对象转化为我们所需要的格式:

>>> print(rows.dataset)
id|name|age|city
--|----|---|----
1 |张三  |27 |南京  
2 |李四  |32 |深圳  
3 |王五  |27 |上海  
4 |张三  |27 |北京  

>>> rows.export('json')
'[{"id": 1, "name": "\\u5f20\\u4e09", "age": "27", "city": "\\u5357\\u4eac"}, {"id": 2, "name": "\\u674e\\u56db", "age": "32", "city": "\\u6df1\\u5733"}, {"id": 3, "name": "\\u738b\\u4e94", "age": "27", "city": "\\u4e0a\\u6d77"}, {"id": 4, "name": "\\u5f20\\u4e09", "age": "27", "city": "\\u5317\\u4eac"}]'

>>> print(rows.export('tsv'))
id  name    age city
1   张三  27  南京
2   李四  32  深圳
3   王五  27  上海
4   张三  27  北京

xls, xlsx, dbf, ods这类二进制数据,可以直接保存成文件

>>> with open('output.xls', 'wb') as f:
            f.write(rows.export('xls'))

命令行工具

Records还提供了一个命令行工具,方便的在终端使用:

"""
useage:
  records <query> [<format>] [<params>...] [--url=<url>]
  records -h
"""

>>> records 'select * from users' tsv --url 'sqlite:///test.db'
id      name    age     city
1       张三    27      南京
2       李四    32      深圳
3       王五    27      上海
4       张三    27      北京

其他操作

正如官方的slogan一样:Records: SQL for Humans™,Records是一个非常简单,但是很强大的,使用原生的SQL语句来处理大部分的关系型数据库的操作。

# INSERT
db.query('INSERT INTO users (name, age, city) VALUES (:name, :age, :city)',
          name=name, age=age, city=city)
# UPDATE
db.query('UPDATE users SET city="成都" WHERE name = "赵六"')

# DELETE
db.query('DELETE FROM users WHERE name="赵六"')

文章参考:
http://www.caorongduan.com/index.php/archives/28/

标签: Python Records
最后更新:2022年11月3日

老虎猪

健康、快乐、品质生活

打赏 点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

最近评论
最新 热点 随机
最新 热点 随机
Jenkins部署 在OneNote里使用markdown语法-OneMark 群晖使用花生壳搭建WordPress bootstrap table 图标显示解决 bootstrap div 居中显示 Django根据字段自动从dict中获取值
jQuery实现表格双击修改可保存,取消放弃保存 JQueryMobile实现表格的条件筛选 Django根据字段自动从dict中获取值 Django 重置数据库 自己的Blog bootstrap table 图标显示解决

COPYRIGHT © 2022 你说什么都对. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

浙公网安备 33022602000616号