Pandas 将数据插入 MySQL

Posted

技术标签:

【中文标题】Pandas 将数据插入 MySQL【英文标题】:Pandas Insert data into MySQL 【发布时间】:2017-12-30 12:17:38 【问题描述】:

我正在尝试使用 Pandas (Python) 将从 .csv 文件中提取的数据列插入 mysql

这是我目前的代码。

import pandas as pd
from pandas.io import sql
from sqlalchemy import create_engine
engine = create_engine('mysql://username:password@localhost/dbname')
with engine.connect() as conn, conn.begin():

df = pd.read_csv('File.csv', usercols=['ID', 'START_DATE'], skiprows=skip)
print(df)

df.to_sql(con=con, name='Table1', if_exists='replace', flavor='mysql')

但是,它没有提到Table1中的具体列名..

我们如何表达?

【问题讨论】:

您的问题中的代码有什么作用?它在语法上不正确。 DataFrame.to_sql... 示例在文档中。 pandas.pydata.org/pandas-docs/stable/io.html#io-sql @cricket_007 我添加了几行(上图)。我要做的是将csv文件('ID'和'START_DATE'列)中的数据插入Table1。 sql.write_frame 不正确。你为什么要这么做?看起来您完全缺少一个 SQLalchemy 连接对象,因此即使在触摸您的 csv 文件之前也要让它工作。您也不需要在写入之前将表读取到数据框 @cricket_007 我修改了上面的代码。到目前为止,它工作正常,因为代码没有错误,并且它按预期从 csv 文件打印数据。现在,我该如何表达,以便可以将来自 csv 文件(df 对象)的数据插入 MySQL 表('Table1')的特定列中? 【参考方案1】:

我认为你的代码应该是这样的

import pandas as pd
from pandas.io import sql
from sqlalchemy import create_engine

df = pd.read_csv('File.csv', usercols=['ID', 'START_DATE'], skiprows=skip)
print(df)

engine = create_engine('mysql://username:password@localhost/dbname')
with engine.connect() as conn, conn.begin():
    df.to_sql('Table1', conn, if_exists='replace')

但是,关于您的问题,除非我对 Pandas 的理解有误,否则 df 目前有任何列,这些列都将写入 mysql 表的同名列。

如果您需要不同的列名,则需要重命名 DataFrame 中的列名

或者使用the parameters, as mentioned,

index:布尔值,默认为 True 将 DataFrame 索引写入列。

index_label:字符串或序列,默认无 索引列的列标签。如果给出 None (默认)并且 index 为 True,则使用索引名称

【讨论】:

非常感谢!当我的 MySQL 数据库准备好时让我试试。如果有任何问题,我会回复。 等等,你为什么要在没有运行 mysql 数据库的情况下提出这个问题? 成功了。数据插入很漂亮。昨天数据库环境没有搭建好。再次感谢您的所有帮助。 几个语法问题。否则这是一个很好的解决方案! df = pd.read_csv('file.csv', usecols=['ID', 'ColumnName'], skiprows=[1]) @unicatcode 我从问题中复制了skiprows=skipusercols【参考方案2】:

这就是我在我的项目中所做的

 import pandas as pd
 import sqlalchemy
 engine = sqlalchemy.create_engine('mysql+pymysql://root:@localhost/pd_test')

 ratings = pd.read_csv('ratings2.csv', sep='\t', encoding='latin-1',
                  usecols=['user_id', 'movie_id', 'user_emb_id', 
 'movie_emb_id','rating'])

 ratings.to_sql('test', con=engine, if_exists='append',index=False,chunksize=1)

希望有帮助!!

【讨论】:

为此答案安装 pymysql。在 Mac 和 venv 上为我工作。

以上是关于Pandas 将数据插入 MySQL的主要内容,如果未能解决你的问题,请参考以下文章

使用 PyMongo 将 Pandas 数据框插入 mongodb

Python将每月值插入每日值(线性):Pandas

将数据从 pandas 数据帧插入 Redshift 表时,Redshift 语句长度超出

加快从 pandas 数据帧到 mysql 的数据插入

如何使用 pandas.read_csv 将 CSV 文件中的数据插入数据框?

使用 SQLAlchemy 和 Pandas 插入数据 - Python