我正在使用mysql gem和Ruby 1.9.3,而不是使用Rails。我有以下内容:
#!/bin/env ruby
# encoding: utf-8
require 'rubygems'
require 'mysql'
# Open DB connection
begin
con = Mysql.new 'localhost', 'root', '', 'data'
con.query("CREATE TABLE IF NOT EXISTS
shops(id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255),
latitude DECIMAL(15,10),
longitude DECIMAL(15,10)
)")
### Loop Starts ###
...
@place = {"name"=>"Tuba", "latitude"=>13.7383, "longitude"=>100.5883}
# Write to DB
### Loop Ends ###
rescue Mysql::Error => e
puts e.errno
puts e.error
ensure
con.close if con
end
问题
@place
是哈希。除了迭代之外,如何快速插入data
表?更新:我的第一次尝试:
col = @place.map { | key, value | key } # => ["name", "latitude", "longitude"]
result = @place.map { | key, value | value } # => ["Tuba", 13.7383, 100.5883]
con.query("INSERT INTO shops (#{col}) VALUES(#{result});")
正如所料,这会产生以下错误:
You have an error in your SQL syntax; check the manual that corresponds
to your MySQL server version for the right syntax to use
near '["name", "latitude", "longitude"] at line 1
答案 0 :(得分:4)
我会制作一种插入数据的方法:
def insert_place(hash, con)
statement = "INSERT INTO shops (name, latitude, longitude) VALUES (#{hash['name']}, #{hash['latitude']}, #{hash['longitude']});"
con.query(statement)
end
此方法将您的哈希值和连接对象作为参数。您应该尽可能重用您的连接。
然后在你的循环中我将使用这样的方法:
@place = {"name"=>"Tuba", "latitude"=>13.7383, "longitude"=>100.5883}
insert_place(@place, con)
最后回答你的上一个问题......如果程序在你的循环中间终止,我没有看到任何会“破坏”你的数据的东西,因为它只是一个查询,它会成功还是失败。两者之间没什么。如果您希望能够在发生故障时再次运行脚本,则需要确定停止的位置,因为再次运行会导致重复。
您可以手动执行此操作并适当地策划数据
OR
你可以将它添加到你的insert_place方法中,这样如果条目已经存在于数据库中,它将跳过con.query(语句)位。
答案 1 :(得分:-1)
在我看来,你需要从数组中提取值
con.query("INSERT INTO shops (#{*col}) VALUES(#{*result});")
可以对代码进行一些改进。我希望这会有用
col = @place.keys # => ["name", "latitude", "longitude"]
result = @place.values # => ["Tuba", 13.7383, 100.5883]
con.query("INSERT INTO shops (#{*col}) VALUES(#{*result});")
# (not tested variant)
con.query("INSERT INTO shops (?) VALUES(?);", col, result)