MySQL的插入语句在Python中不起作用。

14 浏览
0 Comments

MySQL的插入语句在Python中不起作用。

我正在尝试从名为'items.csv'的CSV文件中获取值,然后将这些值存储在名为'articles2'的数据库表中。插入语句触发以下错误:

pymysql.err.InternalError: (1292, "Incorrect datetime value: 'row[3]' for column 'date_added' at row 1")

这是我的代码:

 import csv
    import re
    import pymysql
    import sys
    import os
    import requests
    from PIL import Image
    def insert_articles2(rows):
      rowcount = 0
      for row in rows:
        if rowcount !=0:
           sql = "INSERT INTO articles2 (country, event_name, md5, date_added, profile_image, banner, sDate, eDate, address_line1, address_line2, pincode, state, city, locality, full_address, latitude, longitude, start_time, end_time, description, website, fb_page, fb_event_page, event_hashtag, source_name, source_url, email_id_organizer, ticket_url) VALUES ('row[0]', 'row[1]', 'row[2]', 'row[3]', 'row[4]', 'row[5]', 'row[6]', 'row[7]', 'row[8]', 'row[9]', 'row[10]', 'row[11]', 'row[12]', 'row[13]', 'row[14]', 'row[15]', 'row[16]', 'row[17]', 'row[18]', 'row[19]', 'row[20]', 'row[21]', 'row[22]', 'row[23]', 'row[24]', 'row[25]', 'row[26]', 'row[27]')"
           cursor.execute(sql)
           connection.commit() 
        rowcount+=1
rows = csv.reader(open("items.csv", "r"))
insert_articles2(rows)

这是'articles2'表的结构,请查看所有字段的数据类型。我需要在我的Python脚本中做出什么改变才能使其工作?:

CREATE TABLE IF NOT EXISTS `articles2` (
  `id` int(6) NOT NULL AUTO_INCREMENT,
  `country` varchar(45) NOT NULL,
  `event_name` varchar(200) NOT NULL,
  `md5` varchar(35) NOT NULL,
  `date_added` timestamp NULL DEFAULT NULL,
  `profile_image` varchar(350) NOT NULL,
  `banner` varchar(350) NOT NULL,
  `sDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `eDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `address_line1` mediumtext,
  `address_line2` mediumtext,
  `pincode` int(7) NOT NULL,
  `state` varchar(30) NOT NULL,
  `city` text NOT NULL,
  `locality` varchar(50) NOT NULL,
  `full_address` varchar(350) NOT NULL,
  `latitude` varchar(15) NOT NULL,
  `longitude` varchar(15) NOT NULL,
  `start_time` time NOT NULL,
  `end_time` time NOT NULL,
  `description` longtext CHARACTER SET utf16 NOT NULL,
  `website` varchar(50) DEFAULT NULL,
  `fb_page` varchar(200) DEFAULT NULL,
  `fb_event_page` varchar(200) DEFAULT NULL,
  `event_hashtag` varchar(30) DEFAULT NULL,
  `source_name` varchar(30) NOT NULL,
  `source_url` varchar(350) NOT NULL,
  `email_id_organizer` varchar(100) NOT NULL,
  `ticket_url` mediumtext NOT NULL,
  PRIMARY KEY (`id`),
  KEY `full_address` (`full_address`),
  KEY `full_address_2` (`full_address`),
  KEY `id` (`id`),
  KEY `event_name` (`event_name`),
  KEY `sDate` (`sDate`),
  KEY `eDate` (`eDate`),
  KEY `id_2` (`id`),
  KEY `country` (`country`),
  KEY `event_name_2` (`event_name`),
  KEY `sDate_2` (`sDate`),
  KEY `eDate_2` (`eDate`),
  KEY `state` (`state`),
  KEY `locality` (`locality`),
  KEY `start_time` (`start_time`),
  KEY `start_time_2` (`start_time`),
  KEY `end_time` (`end_time`),
  KEY `id_3` (`id`),
  KEY `id_4` (`id`),
  KEY `event_name_3` (`event_name`),
  KEY `md5` (`md5`),
  KEY `sDate_3` (`sDate`),
  KEY `eDate_3` (`eDate`),
  KEY `latitude` (`latitude`),
  KEY `longitude` (`longitude`),
  KEY `start_time_3` (`start_time`),
  KEY `end_time_2` (`end_time`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=4182 ;

CSV的一个示例行:

country event_name  md5 date_added  profile_image   banner  sDate   eDate   address_line1   address_line2   pincode state   city    locality    full_address    latitude    longitude   start_time  end_time    description website fb_page fb_event_page   event_hashtag   source_name source_url  email_id_organizer  ticket_url
India   India's largest 10K challenge, ProIndiaRun, Hyderabad on April 29th 6fa7ab214c279b765748b28362e9020b    2018-04-10 04:10:45     ../images/events/India-s-largest-10K-challenge-ProIndiaRun-Hyderabad-on-April-29th-Hyderabad-4-banner.png   2018-04-29 00:00:00 2018-04-29 00:00:00         500041  Telangana   Hyderabad       TBA, Hyderabad, Hyderabad, Telangana, 500041            05:00:00    10:00:00    Event Description,,ProIndiaRun, Hyderabad,,Welcome to Pro Run India, India's largest 10K challenge happening at Pan India Level in different cities. Come along with them to make India better, to raise the child in their choice of sports supporting them financially.,,,,Pro- Run India is coming to Hyderabad on 29th April 2018. The Run lets you choose from  5k and 10K Run. Hurry, Register today!,,,,5KM RUN : INR 650,,AGE: 10 to 50 Years(Male/Female),,AGE: 51 to 70 Years(Male/Female) VETERUN CATEGORY,,,Finisher Medals,,BIB with Timing Chip,,Electronic Timing Certificate,,Refreshment,,,10KM CHALLENGE : INR 1000,,AGE: 10 to 70 Years(Male/Female),,,Finisher Medals,,BIB with Timing Chip,,Electronic Timing Certificate,,Refreshment,,,PRIZES:-,,5KM (TROPHIES FOR 1ST THREE RUNNER UP'S MALE & FEMALE),,10KM CHALLENGE,,FEMALE,,1ST PRIZE INR 5000/-  2ND PRIZE INR 3000/- 3RD PRIZE INR 2000/-,,MALE,,1ST PRIZE INR 5000/-  2ND PRIZE INR 3000/- 3RD PRIZE INR 2000/-,,,                       https://www.eventsnow.com/events/9232-proindiarun-hyderabad proindiarun@gmail.com

0
0 Comments

问题出现的原因是在Python中的MySQL插入语句不起作用。解决方法是使用正确的语法和参数来执行插入操作。

在给定的代码中,使用了错误的语法来插入数据。在插入语句中,传入的是字符串"'row[0]'","'row[1]'","'row[2]'"等等,而不是实际的变量值。

根据官方文档的示例,正确的用法是在插入语句中使用占位符,并在execute函数中传入要插入的值。

所以在这种情况下,正确的写法应该是:

sql = "INSERT INTO `articles2` (`country`, `event_name`, `md5`, ..., `ticket_url`) VALUES (%s, %s, %s, ..., %s)"
cursor.execute(sql, row)

另外,如果要插入的数据列与CSV文件的顺序完全匹配,可以省略指定列名的部分。

使用executemany函数可以避免使用for循环,将整个批量数据一次性插入,提高效率。

cursor.executemany(sql, rows)

通过以上的修改,可以解决MySQL插入语句在Python中不起作用的问题。

0