栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

python数据库使用pandas和sqlalchemy以及Table的使用

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

python数据库使用pandas和sqlalchemy以及Table的使用

这次的主题是,把CSV(或其他)文件格式的数据,存储进MySQL数据库,并且表结构主键都要建立。包括日期格式的处理。虽然很简答,但是有很多细节的东西,而且知识面也比较广,就写下来。

三张表格,如下
articles:

issues:

sales:

import numpy as np
import pandas as pd

# 和数据库交互的模块,这里和pandas共同作用,如果没有就自己pip。
import sqlalchemy

# 这是表,元数据,外键等,一会可能会用到。
from sqlalchemy import Table,metaData,ForeignKey,Column,Integer,String,DateTime,Date,Float
# 先读取数据集,看看数据的格式空值等等,要不要加以处理,不能一股脑随便的就进数据库
# 第一个数据里面不整齐,有多余的分隔符,所以就取了前4列

data1 = pd.read_csv("../data/hfda_ch12_articles.csv",sep=",",usecols=[0,1,2,3])
data2 = pd.read_csv("../data/hfda_ch12_issues.csv")
data3 = pd.read_csv("../data/hfda_ch12_sales.csv")

数据格式前面已经贴图了,这里也不做处理了。这是深入浅出数据分析书里面讲到的一组数据源,有时间会把分析过程贴出来。

# 这是sqlalchemy链接数据库的引擎。格式固定,****位置填写自己的数据库密码
engine = sqlalchemy.create_engine("mysql+pymysql://root:****@localhost:3306/hjb")

"mysql+pymysql://用户名:密码@localhost:3306/数据库名"
这个数据库名不是MySQL,别把MySQL填上去。。。是你要use的那个数据库的名字。。。。。
中间不能有空格!!!!!
冒号必须是英文的,中文的报错,而且很难看出来,会很烦,别问我为什么知道。

# 获得元数据
metadata = metaData()

# Column函数:前面import进来的
#             "表名", metadata,
#             Column('mytable_id', Integer, primary_key=True),
#             Column('value', String(50))
# 建立表格,各个字段的名称,和类型,主键约束等
articles = Table(
            "articles_fuben",metadata, # 我的名字后加了副本,因为我的数据库中已经有这三张表了
            Column("articleID",Integer,primary_key=True),
            Column("issueID",Integer),
            Column("authorID",Integer),
            Column("webHits",Integer)
)

issues = Table(
            "issues_fuben",metadata,
            Column("issueID",Integer,primary_key=True),
            Column("PubDate",Date)                 # 注意类型是Date型,也可以是Datetime
)

sales = Table(
            "sales_fuben",metadata,
            Column("saleID",Integer,primary_key=True),
            Column("issueID",Integer),
            Column("lotSize",Integer)
)

建立表和表结构,并且把这些表放进元数据里,可以这么理解。元数据里就有这几张表,空的。

# 用元数据,建立所有的表
metadata.create_all(bind=engine)
# 这个建立表示在MySQL数据库里建立的,所以要绑定引擎。
# 这一行运行结束就可以查看数据库中是不是产生了三张表

# 也可以用单个表来操作,建立表格,不赘述
# articles.create(bind=engine)

表格建好了,就剩插入数据了,中间还有什么工作?
CSV表中的数据,和我们元数据定义的类型是不是一样的?能不能插入进去,这个要清楚。
检查一遍,不能是字符串格式存进 Integer里面。
还有一个时间模式呢,我们必须要把dataframe中时间转过来。不然插是会报错的,不信你可以试一下。

s = data2["PubDate"]
data2["PubDate"] = pd.to_datetime(s)
# 要观察转后的时间是不是你要的。年月日有没有颠倒等。
# 从CSV到dataframe,会有一个默认的index,从0开始的下标,存入数据的时候不需要存。
# if_exists 默认是fail,但是我们已经建立了表,所以直接append就行
# 这三个存,最好分开运行,因为这里没有用事务,可能会存进去一半报错了。
# 或者用Navicat查看下数据。
pd.io.sql.to_sql(data1,"articles_fuben",engine,if_exists="append",index=False)
pd.io.sql.to_sql(data2,"issues_fuben",engine,if_exists="append",index=False)
pd.io.sql.to_sql(data3,"sales_fuben",engine,if_exists="append",index=False)

另外,pandas可以直接存数据,如果不先建立表结构,存进去的数据类型,和主键约束等,都是没有的,这个看你自己了,如果不需要,那就直接用pandas存,不用元数据建表也行。我之前学习时候用的都是直接存的。

# 如果要插入或者删除更改,以及查询,可以用下面的语句
engine.execute("insert into ........")

# 查询会有返回值的查看
a = engine.execute("select ..........")
a.fetchone()
#从数据库读出来也可以用pandas
# 也可以分页读取等等,只要看你的语句怎么写了
pd.read_sql("select * from articles",engine)
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/422875.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号