【发布时间】:2017-12-30 07:27:26
【问题描述】:
我是 Python 新手,正在尝试学习一些基本的数据操作(主要重点是数据科学)。所以我仍然在掌握 Pandas 和其他一切。 我想要实现的是创建一个 DataFrame 并将其存储在 MySQL 数据库中。这是我的脚本(不起作用):
from sqlalchemy.types import VARCHAR
from sqlalchemy import create_engine
import pandas as pd
import numpy as np
frame = pd.DataFrame(np.random.random((4,4)),
index=['val1','val2','val3','val4'],
columns=['col1','col2','col3','col4'])
engine = create_engine('mysql+pymysql://user:password@localhost/python_samples')
frame.to_sql('rnd_vals', engine, dtype={'index':VARCHAR(5)})
当我尝试执行此操作时,我收到一条错误消息,指出 MySQL 不允许在没有长度的情况下创建 TEXT/BLOB 索引:
InternalError: (pymysql.err.InternalError) (1170, "BLOB/TEXT column 'index' used in key specification without a key length") [SQL: 'CREATE INDEX ix_rnd_vals_index ON rnd_vals (`index`)']
我相信我可以通过在 to_sql() 函数上指定 dtype 选项来解决这个问题,但它没有帮助。 我找到了一种方法,通过连接两个 DataFrame,一个带有值,另一个带有索引:
from sqlalchemy.types import VARCHAR
import pandas as pd
import numpy as np
from sqlalchemy import create_engine
frame = pd.DataFrame(np.random.random(25).reshape(5,5),
columns=['Jan','Feb','Mar','Apr','May'])
idxFrame = pd.DataFrame({'index':['exp1','exp2','exp3','exp4','exp5']})
frame = frame.join(idxFrame)
frame=frame.set_index('index')
engine = create_engine('mysql+pymysql://user:password@localhost/python_samples')
frame.to_sql('indexes',engine,if_exists='replace', index_label='index',
dtype={'index':VARCHAR(5)})
这按预期工作,但我真的怀疑这是制作这个的正确方法,有人可以帮助我吗?我做错了什么?
谢谢
【问题讨论】:
-
很确定第一个示例中的问题是 Pandas 命名索引的方式与您的 dtype 映射之间的名称不匹配,但现在无法检查。
-
给你的第一个例子,检查什么是
frame.index.name。 -
谢谢 Ilja Everilä,解决了。索引名称实际上是“None”,所以当我将 dtype 从 {'index':VARCHAR(5)} 更改为 {'None':VARCHAR(5)} 时,它解决了问题!
标签: mysql python-3.x pandas indexing sqlalchemy