gpt4 book ai didi

mysql - Python3、Pandas 和 MySQL 索引问题

转载 作者:行者123 更新时间:2023-11-30 21:55:39 27 4
gpt4 key购买 nike

我是 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)})

这按预期工作,但我真的怀疑这是否是正确的方法,有人可以帮助我吗?我做错了什么?

谢谢

最佳答案

对于遇到这个问题的人,Ilja Everilä 在评论中解决了这个问题。索引名称实际上是“无”,而不是“索引”,所以当我从

更改数据类型时
dtype={'index':VARCHAR(5)}

dtype={'None':VARCHAR(5)}

它解决了这个问题,表在 MySQL 上创建为:

CREATE TABLE `rnd_vals` (
`index` text,
`col1` double DEFAULT NULL,
`col2` double DEFAULT NULL,
`col3` double DEFAULT NULL,
`col4` double DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8

正如预期的那样。

谢谢大家!

关于mysql - Python3、Pandas 和 MySQL 索引问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45285184/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com