sqlite字段是否存在_Pandas连接sqlite数据库

之前写了一个爬虫,爬取今日头条热点栏的热点新闻。详情可以参考

鱼啊鱼:贪心学院Python训练营第四周-今日头条爬虫​zhuanlan.zhihu.com

原本数据是保存为本地JSON文件的,后来觉得每天都要有文件比较麻烦。不如保存到sqlite数据库好了。所以就尝试了一下Pandas连接sqlite数据库来保存数据。中间遇到了几个坑,所以就想写个笔记,分享一下。

本文只测试了sqlite,至于mysql、postgres还没有经过测试。

需要安装第三方库:SQLAlchemy


需要先建立和数据库API。

from sqlalchemy import create_engine

#参数字段 sqlite:///<database path>
engine = create_engine('sqlite:///test.db') 

以下是SQLAlchemy官网的文档说明。

# sqlite://<nohostname>/<path> # where <path> is relative: engine = create_engine('sqlite:///foo.db')
And for an absolute file path, the three slashes are followed by the absolute path: # Unix/Mac - 4 initial slashes in total
engine = create_engine('sqlite:absolute/path/to/foo.db') # Windows
engine = create_engine('sqlite:///C: path to foo.db') # Windows alternative using raw string
engine = create_engine(r'sqlite:///C:pathtofoo.db')
To use a SQLite :memory: database, specify an empty URL:
engine = create_engine('sqlite://')
More notes on connecting to SQLite at SQLite.

如果看不懂我就大致给大家解释一下。

因为sqlite是很轻量数据库,不需要很多杂七杂八的服务什么的,而且python也自带了sqlite的API库,所以这里的参数字段设置非常简单,只需要 " sqlite:/// + 数据库文件路径 " 就可以了。需要注意不同操作系统下对于路径的书写方式。另外,如果要连接的是内存中的sqlite数据库,那只需要写 " sqlite:// "就可以了。

连接完了数据库,接下来我们就改写入数据了。dataframe的对象提供了dataframe.to_sql('表单名称', con='数据库接口')的方法来把数据直接写入数据库。默认会创建一个新表,表名就是第一个参数。

import pandas
data = {
	'name':['小明','小红']
}

df = pandas.DataFrame(data)
df.to_sql('tb_test',con=engine)

aaa15ee13ef9fdcbaaae48dc7667246e.png

可以看到已经成功添加进去了。

但如果真的那么简单,我也不会踩到坑了。我们知道,Python的数据类型要比数据库的数据类型多很多,大多数情况pandas会帮我们自动处理掉,但偶尔也会出现处理不了的情况的。比如,我们来试试别的数据类型看看。另外,这里再补充一点,因为我们刚刚创建过这个名称的表单了,所以就会涉及要创建的表单已在当前数据库中存在的问题,这时候我们就需要另外一个 if_exits 参数了。该参数默认值是 'fail' ,另外可以传入 'replace' 或者 'append' ,前者是覆盖,后者是添加。

data = {
	'name':['小明','小红'],
	'brothers':[['小张','小李'],[]]
}

df = pandas.DataFrame(data)
df.to_sql('tb_test',con=engine, if_exists='replace')

结果报错了。

sqlite3.InterfaceError: Error binding parameter 2 - probably unsupported type.

这是因为我们的数据里,'brothers' 列中的数据类型为列表,pandas在向sqlite写数据的时候是无法自动为我们转化list数据类型的(实际上dict类型什么的也都不可以,这些数据类型在dataframe的dtype里都数据object)。

所以我就把所有dtype是object的数据,全部转化成json格式。写入数据库,因为这样下次再读取的时候,也很容易重新转化成python的数据类型。

data = {
	'name':['小明','小红'],
	'brothers':[['小张','小李'],[]]
}

df = pandas.DataFrame(data)

for col in df.columns:
	if df[col].dtype == 'object':
		df[col] = list(map(json.dumps, df[col]))

没有报错,说明成功写入数据库了。注意:这个方法不适用于自定义的类,因为自定义类没有办法直接通过 json.dumps() 的方式转化成json格式。自定义类的dtype也是属于object。

因为我录入的是爬虫数据,本身也是从json格式数据解析过来的,所以这里不会遇到这种情况。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值