前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python的“懒人”包DataSet解析

Python的“懒人”包DataSet解析

作者头像
哒呵呵
发布2018-12-24 14:44:02
10K0
发布2018-12-24 14:44:02
举报
文章被收录于专栏:鸿的学习笔记鸿的学习笔记

DataSet是一个“适合懒人”的数据库包,可以省去很多ORM框架和写SQL语句的麻烦,直接使用Pythonic的方式操作数据库。

导论

首先引入DataSet包:

代码语言:javascript
复制
import dataset

数据库的连接遵循Python的DBurl规范:dialect://user:password@host/dbname。

代码语言:javascript
复制
# 连接SQLite
db = dataset.connect('sqlite:///mydatabase.db')

# 连接database
db = dataset.connect('mysql://user:password@localhost/mydatabase')

# 连接PostgreSQL
db = dataset.connect('postgresql://scott:tiger@localhost:5432/mydatabase')

从源码上来看,依然使用了sqlalchemy的create_engine方法,

代码语言:javascript
复制
self.engine = create_engine(url, **engine_kwargs)

连接数据库

指定数据库中的表时,可以使用类似于字典的语法,当表不存在时,会默认建表。

代码语言:javascript
复制
# 获得user表的实例
table = db['user']

核心方法是create_table,当表不存在现有数据库时,会调用Table类,在数据库建表,Table类的核心是_sync_table和_sync_columns,根据传入的数据修改表结构和建表。

代码语言:javascript
复制
def create_table(self, table_name, primary_id=None, primary_type=None):
    assert not isinstance(primary_type, six.string_types), \
        'Text-based primary_type support is dropped, use db.types.'
    table_name = normalize_table_name(table_name)
    with self.lock:
        if table_name not in self._tables:
            self._tables[table_name] = Table(self, table_name,
                                             primary_id=primary_id,
                                             primary_type=primary_type,
                                             auto_create=True)
        return self._tables.get(table_name)

基本数据库操作

有了table类,就可以执行增删改查的操作了:

增删改
代码语言:javascript
复制
# 插入一条新数据
table.insert(dict(name='John Doe', age=46, country='China'))

# dataset会在插入一条没有的列的数据时,会自动创建没有的列
table.insert(dict(name='Jane Doe', age=37, country='France', gender='female'))

# 更新所有name=John Doe的数据
table.update(dict(name='John Doe', age=47), ['name'])

# 删除name=John Doe的数据,如果没有传入值,则会删除所有表中数据
table.delete(name='John Doe')

# 如果更新的数据key存在会执行update操作,否则插入一条新的列
table.upsert(dict(id=10, title='I am a banana!'), ['id'])
查询数据

all方法返回所有数据

代码语言:javascript
复制
users = db['user'].all()

并且将Select语句抽象为find方法:

代码语言:javascript
复制
# 查询表中country='China'的数据
chinese_users = table.find(country='China')

# 获得指定的name='John Doe'的一条数据
john = table.find_one(name='John Doe')

# 批量查询id=1, id=3, id=7的数据
winners = table.find(id=[1, 3, 7])

# 执行比较操作符
elderly_users = table.find(age={'>=': 70})
possible_customers = table.find(age={'between': [21, 80]})

# 直接使用sqlalchemy的方法
elderly_users = table.find(table.table.columns.age >= 70)

最后也提供query方法直接使用SQL语句:

代码语言:javascript
复制
result = db.query('SELECT country, COUNT(*) c FROM user GROUP BY country')
for row in result:
   print(row['country'], row['c'])

事务操作

对于数据库,免不了事务操作。DataSet使用上下文管理器,自动管理commit和关闭连接:

代码语言:javascript
复制
with dataset.connect() as tx:
    tx['user'].insert(dict(name='John Doe', age=46, country='China'))

其等价于:

代码语言:javascript
复制
db = dataset.connect()
db.begin()
try:
    db['user'].insert(dict(name='John Doe', age=46, country='China'))
    db.commit()
except:
    db.rollback()

源码中则是实现了enter__和__exit方法。

代码语言:javascript
复制
def __enter__(self):
    """Start a transaction."""
    self.begin()
    return self

def __exit__(self, error_type, error_value, traceback):
    """End a transaction by committing or rolling back."""
    if error_type is None:
        try:
            self.commit()
        except Exception:
            with safe_reraise():
                self.rollback()
    else:
        self.rollback()

元数据管理

除了对数据进行操作外,DataSet还支持对元数据进行管理,调用tables方法可以返回数据库里所有表的表名,table类的columns方法则可以查看所有列名。

代码语言:javascript
复制
>>> print(db.tables)
[u'user']    

>>> print(db['user'].columns)
[u'id', u'country', u'age', u'name', u'gender']    
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-12-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 鸿的学习笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 导论
  • 连接数据库
  • 基本数据库操作
    • 增删改
      • 查询数据
      • 事务操作
      • 元数据管理
      相关产品与服务
      数据库
      云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档