【问题标题】:Insert into phpmyadmin with python sql fails使用 python sql 插入 phpmyadmin 失败
【发布时间】: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 添加了编辑,您能否详细说明表名可能是问题的含义

标签: python mysql pandas


【解决方案1】:

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

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()

确保表名不是现有表,如果schema已经创建了表,上面的方法不起作用,所以这会创建一个新表,并根据它创建自己的schema数据框

感谢@Buran 提出的导致答案的建议

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 2016-01-03
    相关资源
    最近更新 更多