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=skip
和usercols
【参考方案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
将数据从 pandas 数据帧插入 Redshift 表时,Redshift 语句长度超出