【问题标题】:Insert statement does not work for datatype mismatch插入语句不适用于数据类型不匹配
【发布时间】:2018-09-25 14:14:48
【问题描述】:

我正在使用 Scrapy 和 Python 从网站上抓取数据,并将数据存储在 csv 文件中。然后我试图从 csv 文件中获取值并尝试将值存储在 mysql 数据库表中。 insert 语句既不会触发错误,也不会向数据库插入任何数据。我检查了值来自 csv 的字段的数据类型。都是字符串。存储在 csv 中的所有值都是字符串格式。这就是为什么在将值存储在 db 中时,除了 string/varchar 之外的所有数据类型都会产生问题。我现在该怎么办? 除了 varchar,我的数据库表中还有 int(6) 列和时间戳数据类型。

导入 csv 重新进口 导入 pymysql 导入系统

connection = pymysql.connect (host = "localhost", user = "root", passwd = ".....", db = "city_details")       
cursor = connection.cursor ()

def insert_articles2(rows):
  rowcount = 0
  for row in rows:
    if rowcount!= 0:
       sql = "INSERT IGNORE 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 (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %d, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)" 
      cursor.execute = (sql, (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]))
    rowcount+=1
rows = csv.reader(open("items.csv", "r"))
insert_articles2(rows)

connection.commit()

articles2的表结构

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 ;

【问题讨论】:

  • 代码很重要,请给我们一些说明您的问题的内容,以便我们更好地了解您的具体情况。
  • @tadman :添加了完整代码。请看。
  • 这是一个很大的改进,但由于这与您的 CSV 数据有关,您可能还需要包含该示例。您确定不是无意中尝试将带有文本的标题行导入数字列吗?
  • @tadman:没有。此外,我检查了 csv 中所有行的所有字段的数据类型。在所有情况下,我都发现它是字符串。做什么?
  • 除非您可以举一个您尝试导入失败的行的示例,否则这是一个消除过程。开始删除东西直到它起作用,然后把东西放回去直到它失败。

标签: python mysql csv scrapy


【解决方案1】:

不管这个特定的 SQL 相关错误,很可能取决于某些数据不匹配,我强烈建议避免导出到 CSV 的步骤,而是添加 scrapy-mysql-pipeline ,这会将您抓取的项目直接导出到MySQL 表,从那里您可以轻松地将日期移动到其他表或处理它...

如果您不能使用管道和/或您想要更可定制的东西,那么您可以查看this answer here on stackoverflow,您将找到有关如何编写自己的自定义 mysql 管道的有用信息...

【讨论】:

  • 感谢您的回复。我还要问你一件事。如果您看到表结构,则唯一的 int 类型是 pincode。但我从 csv 获取的是字符串。这就是为什么我明确地将我的 pincode 转换为 int:pin = int(pin)。我仍然收到此错误:“TypeError: %d format: a number is required, not str”你能告诉我这里发生了什么吗?
  • @Deba 对于所有格式的列,你有 %s 说明符......你需要 %d 或 %i ...
  • 实际上我是从旧文件中复制代码的。即使使用 %d 作为密码,我也得到了那个错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-13
  • 2021-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多