如何用Python自动操作数据库?

2020-12-08 10:06:21 浏览数 (1)

我在使用 Python 之前,做数据分析工作的流程,一般是先打开数据库客户端,然后运行一段写好的 SQL 语句,把数据查询出来,然后再把数据复制到 Excel 中并制作报表。

在使用 Python 之后,这些工作都可以变成自动化,从而让我有更多的时间,去思考和解决业务相关的问题,而不是陷入重复使用工具的手动操作。

吴军在《数学之美》中说:

技术其实分为术和道两种,具体的做事方法是术,做事的原理和原则是道。

很多具体的技术,很快就会落伍,所以只追求术的人,一辈子会很辛苦,还容易被淘汰。只有理解了事物的本质和精髓,才能做到游刃有余。要想真正做好一件事,其实离不开长期的刻意练习。

我写的很多文章,在介绍「术」的同时,也希望能够传达「道」的理念,也就是把工具和思维相结合。

今天介绍的技术,是用 Python 自动操作数据库的方法。

1. 安装和导入模块

以 Python 中的 SQLAlchemy 模块为例,配合使用其他第三方模块,SQLAlchemy 能够操作各种数据库,包括 Oracle、PostgreSQL、MySQL、SQLite、SQL Server 等等,如果你还没有安装,可以通过以下命令进行安装:

代码语言:javascript复制
pip install sqlalchemy

要测试 SQLAlchemy 模块是否正确安装,可以在 Jupyter Lab 中运行以下代码:

代码语言:javascript复制
# 导入库
import sqlalchemy as sa

# 查看 SQLAlchemy 版本
sa.__version__

如果该模块正确安装,就会输出版本号,我目前使用的版本是 1.3.20。

不同的数据库,需要安装不同的第三方模块,比如说,要操作 Oracle,那么通常需要先安装 cx_Oracle:

代码语言:javascript复制
pip install cx_Oracle

2. 连接数据库

在开始操作数据库之前,需要先创建一个数据库引擎,然后再连接数据库:

代码语言:javascript复制
from sqlalchemy import create_engine

# 创建数据库引擎
engine = create_engine('oracle://user:password@ip_address:1521/orcl')

# 连接数据库
con = engine.connect()

其中用户名、密码和 IP 地址等基本信息,要根据自己的实际情况进行修改。

3. 创建表

为了演示用 Python 自动操作数据库,假设你的数据库账号拥有创建表的权限,那么就可以执行下面的语句,实现创建一个新的表:

代码语言:javascript复制
# 执行创建表的 SQL 语句
sql = 'create table usr(id integer, name varchar2(50))'
con.execute(sql)

4. 增删改查

数据库的常用操作包括增、删、改、查,下面分别简单演示一下。

首先,增加两行模拟用的数据:

代码语言:javascript复制
# 增
con.execute("insert into usr(id, name) values(1, 'Jim')")
con.execute("insert into usr(id, name) values(2, 'Joe')")

其次,删除其中一行:

代码语言:javascript复制
# 删
con.execute('delete from usr where id = 1')

然后,修改另一行数据:

代码语言:javascript复制
# 改
con.execute("update usr set name = 'Jack' where id = 2")

虽然 SQLAlchemy 非常强大,但是如果能配合 Pandas 一起使用,那么就能双剑合璧,从而更好地解决数据处理和分析的问题。

比如说,按条件查询指定的数据:

代码语言:javascript复制
# 查
sql = 'select id, name from usr where id = :id'
import pandas as pd
df = pd.read_sql(sa.text(sql), engine, params={'id': 2})

df

id

name

0

2

Jack

5. 数据备份和删除表

有时候,我们还需要把数据备份到数据库中,如果直接使用 Pandas 的 to_sql 函数,那么字符串类型的列会被自动存储为 CLOB,这样后续处理起来就会比较麻烦。

我们可以用一个函数,实现自动转换为 NVARCHAR 类型:

代码语言:javascript复制
from sqlalchemy.types import NVARCHAR, Float, Integer

# 映射数据中的列与数据类型,避免存为 CLOB
def mapping_df_types(df):
    dtypedict = {}
    for i, j in zip(df.columns, df.dtypes):
        if "object" in str(j):
            dtypedict.update({i: NVARCHAR(length=255)})
        if "float" in str(j):
            dtypedict.update({i: Float(precision=2, asdecimal=True)})
        if "int" in str(j):
            dtypedict.update({i: Integer()})
    return dtypedict

# 把数据备份到数据库,替换现有表,如果把 replace 换成 append,那么就是附加数据
dtypedict = mapping_df_types(df)
df.to_sql('usr_backup', engine, index=False, if_exists='replace', dtype=dtypedict)

这个功能还可以应用于不同数据库之间的数据迁移。比如说,从一个 MySQL 数据库中查询指定的数据,保存为 df,然后再附加到 Oracle 数据库中。

如果设置好相应的定时任务,就能实现用 Python 自动操作数据库,从而自动完成相关工作。

最后,我们删除上面演示用的两个表,并关闭数据库连接,节约资源,减少浪费,这是一个很好的习惯。

代码语言:javascript复制
# 删除表
con.execute('drop table usr')
con.execute('drop table usr_backup')

# 关闭数据库连接
con.close()

小结

本文介绍了用 Python 自动操作数据库的一些常用方法,从 SQLAlchemy 和 cx_Oracle 模块的安装和导入,到连接数据库,再到创建表和增删改查,最后对数据进行备份和删除表,这些操作都可以在 Jupyter Lab 中一键执行,自动完成一些数据库的相关操作。

事实上,你可以根据自己的实际情况,修改数据库的类型和字符串连接等信息,并执行各种各样的 SQL 语句,自动完成更加复杂的数据库操作。

随着机器变得越来越智能,许多工作都变得越来越自动化,导致很多人担心被机器抢了饭碗,忧虑遭遇中年危机,这也是人之常情,但我们要学会积极应对。

虽然数据分析的工具变化得很快,但数据分析的思维基本不变,而且方法总比困难多。如果我们把新的技术工具,与数据分析的思维相结合,应用于实际工作中,洞察事物的本质,那么就能更好地完成自己的工作,从而创造更大的价值。

代码语言:javascript复制

0 人点赞