python数据科学手册_Python数据科学实践 | 数据库1

03ddec0c843aab6c0ffa4b77f44910f0.gif d048ae581ee3e88d1a26c9cbd22dcd66.png

大家好,基于Python的数据科学实践课程又到来了,大家尽情学习吧。本期内容主要由智亿同学与政委联合推出。

数据库永远是数据管理上最值得使用的工具。而把所收集的大量数据放入数据库之后再处理是数据科学实践项目中必不可少的一步。通过前面章节的学习,我们已经掌握了利用Python分析数据的众多模块,特别地也展示了如何利用爬虫技术爬取本书中最常使用的火锅团购数据的全过程。本章假设的分析场景是火锅团购数据被爬取后,由于数据量过大已经进入数据库保存。本章所要讲解的内容是如何通过Python与数据库交互完成数据科学实践项目。具体内容将会通过Python的SQLAIchemy模块讲解。

为什么使用SQLAlchemy?

在回答这个问题之前,得先回答另一个问题:为什么要使用SQL?

试想一下,在第七章网络爬虫中,我们直接使用excel、txt和csv文件作为数据存储的载体,这样做会遇到什么问题?

首先,当数据结构非常复杂的时候,无论用excel、txt还是csv,都无法比较良好的维护数据结构。比如,以下数据结构:

[
    (311, "老北京涮羊肉", '11:00-21:00', [['周一', '满60减10'], ['周二', '满100减20']]),
    (312, "大龙燚火锅", '10:00-22:00', [['周一', '满60减10'], ['周二', '满100减20']]),
    (313, "一尊皇牛", '00:00-24:00', [['周一', '满80减10'], ['周二', '满100减10']]),
]

上面的数据结构表示:三家店的店ID、店名、营业时间、每天的优惠活动(这里只为说明问题,列举两天)。上面的数据结构存在明显不合理:一家店只有一个店名和营业时间,只用一行数据就可以表示一家店的信息了;但是,一家店会有多个优惠活动,这必须要用多行数据才可以表示。也就是说,这里的数据结构既表示了1对1的关系,也表示了1对N的关系。

此时,店家基本信息和优惠活动放在一张表中就明显不合适了,需要至少两张表才可以比较好的维护。假如用excel文件,店名必须要输入N遍(试想一下有20~30个优惠券活动,那么店名就得重复输入至少20次),这非常不方便,而且也不利于数据结构的查看。

但是,如果将这个数据结构用Python的class实例来表示,就非常容易地能看出数据表的结构了:

class ShopBasic(Base):
    # 表的名字:
    __tablename__ = 'basic'

    # 表的结构:
    # 商户的ID,名字与营业时间
    id = Column(Integer, primary_key=True, autoincrement=True) 
    name = Column(String(50))
    time = Column(String(20), nullable=True)


class ShopCoupon(Base):
    # 表的名字:
    __tablename__ = 'coupon'
    # 团购优惠的ID,名字,优惠时间与对应的商户的ID
    id = Column(Integer, primary_key=True, autoincrement=True)
    day = Column(String(5))
    coupon = Column(String(30))
    # 添加外键
    shop_id = Column(Integer, ForeignKey('shopbasic.id'))

其次,当数据量比较大的时候,就需要频繁地对数据进行读取。如果使用excel进行数据管理,会十分消耗计算机性能,且大大降低了运行效率。这时候,就需要使用SQL来进行数据维护了。

在明白为什么要使用SQL后,就可以回答为什么需要SQLAlchemy了。编写原生的SQL语句学习成本比较高,如果能有工具可以实现直接用Python语法写SQL语句的话,岂不美哉!ORM(Object-relational mapping)就是专门为了解决这个问题而创造的,SQLAlchemy就是其中的典型代表。

9.1 初级篇——SQLAlchemy的基本使用

在明白为什么需要使用SQLAlchemy后,我们来看看如何使用SQLAlchemy。本章运行环境为:Python3.5.2,SQLAlchemy1.2.16

9.1.1连接数据库

SQLAlchemy支持多种主流的SQL,如PostgreSQL、MySQL、SQLite、Oracle、SQL Server。由于很多嵌入型的应用都自带SQLite数据库,所以,在读者看到此书时,很可能电脑上已经安装了这个数据库(没有安装的读者请自行到官网安装https://www.sqlite.org/download.html)。为方便起见,本书以SQLite对SQLAlchemy进行讲解,其他类型的数据库会有细微区别,使用时根据提示信息进行查阅即可。

表9.1.1 需要用到的函数

183a94d15427741b170a50ee010a4139.png

例9.1.1 示例代码

import os
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base

# 改成你存放数据库文件的路径,注意data.db需要提前创建
db_file = r'E:\pythonProjects\cluebearpython\chapter11\data'
engine = create_engine(name_or_url='sqlite:///{}'.format(os.path.join(db_file, 'data.db')))
DBSession = sessionmaker(bind=engine)
# 创建数据库会话实例
sess = DBSession()

# 关闭session
sess.close()

在上面的代码中,由于SQLite是基于文件的数据库,所以,我们需要先data.db。创建data.db后,创建数据库连接,最后创建数据库会话实例,以及会话实例的关闭。注意,由于不同数据库各自的特性,一些参数是某个或者某几个数据库独有的,在这里由于篇幅原因,不一一列举,读者视自身需求查阅相关文档即可。

9.1.2 创建数据表

第一步展示了如何构建数据库连接并创建数据库会话。在这一步,我们将学习如何创建数据表。

表9.1.2 需要用到的函数 

11090030206e2604ca38d61cd689cc97.png

以本章开篇的两个数据表为例,

例9.1.2 

import os
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker, relationship
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, String, Integer, ForeignKey

# 改成你存放数据库文件的路径,注意data.db需要提前创建
db_file = r'E:\pythonProjects\cluebearpython\chapter11\data'
engine = create_engine('sqlite:///{}'.format(os.path.join(db_file, 'data.db')), encoding='utf8')
DBSession = sessionmaker(bind=engine)
# 创建数据库会话实例
sess = DBSession()


Base = declarative_base()
class ShopBasic(Base):
    # 表的名字:
    __tablename__ = 'basic'

    # 表的结构:
    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String(50))
    time = Column(String(20), nullable=True)


class ShopCoupon(Base):
    # 表的名字:
    __tablename__ = 'coupon'

    id = Column(Integer, primary_key=True, autoincrement=True)
    day = Column(String(5))
    coupon = Column(String(30))

# 会自动检查表是否存在,如果表不存在,则创建;如果已经存在,则忽略,也可以手动注释,增强可读性。
Base.metadata.create_all(engine)

在上面的代码中,截止到创建数据库会话的部分都不变。之后:

1. 先用声明式方法,显式关联数据库表和Python中的Class对象;

2. 然后让需要创建或者关联的表的类继承Base对象,每个类中有两个必须声明的部分:表的名字,这样才能让程序正确关联相应的数据表;表的字段。如果字段未创建,用Column方法创建字段的相关参数;如果字段已经创建,则在Column中指定字段名即可。

3. 最后,调用Base.metadata.create_all()方法创建以上两张表。

至此,数据表的创建也已经完成。通过这种声明式创建、关联表结构的方式,能够让我们非常清楚的了解数据表的结构,并在此基础上进行增删改查。

好了,今天就讲到这里。

▼往期精彩回顾▼内容索引 | Python 数据科学实践 59de37d02853488aed4c83c603b035ec.gif

9c775b66440a6d3d142d22083a7c220c.png

“京东购买链接”

【京东参加每满100减50的活动 截止到12号】

6a7dc32eeeec5e4fb20f93ac53da2af9.png

3ee1f1db55c2b4e9f73b176c35aeddd7.png

快进入慕课平台学习吧
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值