0

そのため、.csvを解析して大きなMySQLクエリを出力するための小さなrubyスクリプトを作成しています。問題は、私が使用している名前の一部に一重引用符が付いていることです。これにより、SQLが台無しになります...

理由はわかりませんが、引用符をエスケープ引用符にgsubする試みは失敗しました。しかし、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エスケープを記述しないでください。常に、適切なデータベースドライバによって提供されるメソッドを使用してください。

MySQLmysqlまたは新しい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 に答える