使用python sql插入phpmyadmin失败

使用python sql插入phpmyadmin失败,python,mysql,pandas,Python,Mysql,Pandas,我有下面的笔记本,我试图将数据帧的数据插入我的phpMyAdminSQL数据库 要复制,请运行以下命令: 首先,我用模式创建数据库 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)

我有下面的笔记本,我试图将数据帧的数据插入我的phpMyAdminSQL数据库 要复制,请运行以下命令:

首先,我用模式创建数据库

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 
到目前为止,我们已经有了数据和数据库模式,而且到目前为止还不错。 现在,我尝试插入一些数据以确保连接正常 所以我跑了

我可以看到我可以将数据插入我的数据库,太棒了! 因此,当我现在尝试复制相同的数据并像这样插入数据帧的数据时,问题就出现了

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() 
from sqlalchemy import create_engine
engine = create_engine("mysql://user:password@localhost/database_name")
con = engine.connect()
df.to_sql(name='table you are inserting into',con=con,if_exists='append')
con.close()

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 线程指出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.\u exceptions.OperationalError 1054,NULL

Man您能更具体地说明问题发生的位置吗

我可以将学习此代码看作: 1-你的身份可能缺失。 2-iTerrow可能在执行查询时花费了太多时间,然后破坏了代码 3-也许最好将iterrows与iloc一起使用,而不要使用行['x'] 4-问题可能是因为您指定了pueblo等名称。。。然后在mysql的querie中调用它们

for i in range(0, len(df)):
    print df.iloc[i]['c1'], df.iloc[i]['c2']

为了解决插入问题,我们必须创建一个这样的引擎

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() 
from sqlalchemy import create_engine
engine = create_engine("mysql://user:password@localhost/database_name")
con = engine.connect()
df.to_sql(name='table you are inserting into',con=con,if_exists='append')
con.close()

确保表名不是现有表,如果架构已经创建了表,则上述方法不起作用,因此这将创建一个新表并基于数据帧创建自己的架构


完全归功于@Buran提出的建议,这些建议导致了答案

,请使用。在任何情况下-使用参数化查询,不要使用字符串方法创建INSERT语句查询中的特殊问题是缺少值-INSERT INTO tablename VALUES。。。假设您为表中的所有列添加值。@buran,感谢您的想法,我尝试了Dataframe.to_sql,但也失败了,错误代码为DatabaseError:sql执行失败:从sqlite_master中选择名称,其中type='table'和name=?;2006年,无法回滚,您是否知道如何修复tis,或者这表明我做错了什么?很难说,但您使用的表名似乎有问题。您是否可以编辑您的问题以包含您当前的代码run@buran添加了编辑,您能否详细说明表名可能是issueHi Pedro的意思,因此仔细查看您的建议:[1]没有缺少缩进,如果您愿意,您可以尝试自己运行代码。[2] 这并不是因为有太多的查询,因为如果你写几个打印来查看它在哪里中断,它似乎在第一次插入时就中断了,所以它收集数据,如果你想确保它是正确的,就正确地打印它,而在第一次插入时就失败了。[3] 也许更好,我试试看,但问题似乎不是收集数据。[4] 它不是,因为Pueblo是数据库中模式的引用。谢谢你的建议