通过纯Ruby,数据库连接将哈希插入MySQL

时间:2013-09-20 18:40:03

标签: mysql ruby

我正在使用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

问题

  1. @place是哈希。除了迭代之外,如何快速插入data表?
  2. 循环将继续,直到整个过程结束。我应该在每次插入后关闭连接,还是将其打开直到进程结束?
  3. 如果流程意外终止怎么办?如果连接没有正确关闭,它会影响数据吗?
  4. 更新:我的第一次尝试:

    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
    

2 个答案:

答案 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)