0

所以我正在制作一个小红宝石脚本来解析 .csv 并输出一个大型 MySQL 查询。问题是我正在使用的一些名称有单引号,这会弄乱我的 SQL...

我将引号转换为转义引号的尝试失败了,但我不确定为什么。但是当我打开我的 query.txt 文件时,肯定会出现像 D'vinci 这样的名称,而不是 D\'vinci。

我究竟做错了什么?

require 'csv'

filename = ARGV[0]
q = "INSERT INTO `table` (`username`, `password`, `firstname`, `lastname`, `email`) VALUES "

CSV.foreach(filename) do |row|
  last_name, first_name, email, id = row.each {|c| c.gsub "'", "\'"}
  q += "('#{id}', SHA1('password'), '#{first_name}', '#{last_name}', '#{email}'),\n"
end

q += ";"

File.open("query.txt", 'w').write(q)
4

2 回答 2

3

不要编写自己的 SQL 转义。请始终使用适当的数据库驱动程序提供的方法。

如果您使用的是 MySQL,或者mysql更新的mysql2gem,那么有一个escape函数可以为您处理这个问题。

当大多数数据库都具有某种从文件导入功能时,为什么要首先编写 SQL 并不完全清楚。如果使用正确, MySQL 尤其LOAD DATA INFILE可以读取许多不同的格式。

于 2012-10-12T15:07:48.283 回答
1

each返回接收器。所以,你gsub在那个街区里面什么都不做。改成map,应该没问题。或者,您可以保留each并使用gsub!

于 2012-10-12T16:08:02.063 回答