【发布时间】:2021-06-19 12:19:52
【问题描述】:
我有以下笔记本,我试图将数据框的数据插入到我的 phpmyadmin sql 数据库中 复制运行以下:
首先我使用架构创建数据库
CREATE SCHEMA IF NOT EXISTS `proyecto` DEFAULT CHARACTER SET utf8 ;
USE `proyecto`;
CREATE TABLE IF NOT EXISTS `pueblos`(
`Pueblo` VARCHAR(60) NOT NULL,
`Comunidad` VARCHAR(60) NOT NULL,
`Provincia` VARCHAR(60) NOT NULL,
`Latitud` float NOT NULL,
`Longitud` float NOT NULL,
`Altitud` float NOT NULL,
`Habitantes` int NOT NULL,
`Hombres` int NOT NULL,
`Mujeres` int NOT NULL,
PRIMARY KEY (`Pueblo`))
ENGINE = InnoDB;
在 python 中我导入库
import numpy as np
import pandas as pd
pip install mysqlclient
import MySQLdb
然后我收集数据并像这样转换它
df= pd.read_excel('https://www.businessintelligence.info/resources/assets/listado-longitud-latitud-municipios-espana.xls')
df=df.drop(index = 0)
new_header = df.iloc[0]
df= df[1:]
df.columns = new_header
到目前为止,我们已经有了数据和数据库架构,而且到目前为止一切都很好。 现在,我尝试插入一些数据以确保连接正常 所以我跑了
db=MySQLdb.connect("localhost","root","","proyecto")
insertrec=db.cursor()
a="se"
b="ha"
c="insertado"
sqlquery="INSERT INTO Pueblos (Pueblo, Comunidad,Provincia,Latitud,Longitud,Altitud,Habitantes,Hombres,Mujeres) VALUES('"+a+"', '"+b+"','"+c+"',7,8,9,10,11,12)"
insertrec.execute(sqlquery)
db.commit()
print("Success!!")
db.close()
我可以看到我能够将数据插入到我的数据库中,太棒了! 所以当我现在尝试复制相同的内容并像这样插入我的数据框的数据时,问题就来了
for index, row in df.iterrows():
Pueblo=row['Población']
Comunidad=row['Comunidad']
Provincia=row['Provincia']
Latitud=row['Latitud']
Longitud=row['Longitud']
Altitud=row['Altitud']
Habitantes=row['Habitantes']
Hombres=row['Hombres']
Mujeres=row['Mujeres']
sqlquery="INSERT INTO Pueblos (Pueblo, Comunidad,Provincia,Latitud,Longitud,Altitud,Habitantes,Hombres,Mujeres) VALUES(row['Población'], row['Comunidad'],row['Provincia'], row['Latitud'],row['Longitud'],row['Altitud'],row['Habitantes'],row['Hombres'],row['Mujeres'])"
insertrec.execute(sqlquery)
db.commit()
db.close()
this operation fails.
What am i doing wrong, i believe im simply doing the same as the simple insertion but i cant understand why it doesnt work
编辑 目前正在尝试实施@buran 建议,使用 df.to_sql,但仍然失败 尝试的代码是
df.to_sql("pueblos",db,if_exists='append',index=False)
编辑 2 线程questions about pandas.to_sql 指出 df.to_sql 不再受支持,因此我们目前正在创建一个引擎并通过他们的解决方案进行尝试。 第一个更改是将 int 类型的列索引添加到 db 架构中,因为 df.to_sql 也采用索引 我还创建了一个用户 ana 密码为 ana 与引擎语法的 root 具有相同的权限 从那里尝试像这样实施他们的解决方案
from sqlalchemy import create_engine
engine = create_engine("mysql://ana:ana@localhost/proyecto")
con = engine.connect()
df.to_sql(name='pueblos',con=con,if_exists='append')
con.close()
目前这会产生错误: OperationalError: (MySQLdb._exceptions.OperationalError) (1054,NULL)
【问题讨论】:
-
不要遍历行,而是使用
DataFrame.to_sql。在任何情况下 - 使用参数化查询,不要使用字符串方法创建 INSERT 语句 -
查询中的特殊问题是缺少
VALUES-INSERT INTO tablename VALUES...(假设您为表中的所有列添加值)。 -
@buran ,感谢您的想法,我尝试了 Dataframe.to_sql 但它也失败并出现错误代码 DatabaseError: Execution failed on sql: SELECT name FROM sqlite_master WHERE type='table' AND name=? ; (2006, '') 无法回滚,你知道如何修复 tis,或者这表明我做错了什么
-
这很难说,但看起来你使用的表名有问题。您能否编辑您的问题以包含您运行的当前代码
-
@buran 添加了编辑,您能否详细说明表名可能是问题的含义