gpt4 book ai didi

mysql - 通过纯 Ruby、数据库连接向 MySQL 插入哈希

转载 作者:太空宇宙 更新时间:2023-11-03 18:20:42 24 4
gpt4 key购买 nike

我使用的是 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. 如果进程意外终止怎么办?如果没有正确关闭连接,是否会影响数据?

更新:我的第一次尝试:

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

最佳答案

我会创建一个方法来插入您的数据:

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)

最后回答你的最后一个问题...如果程序在你的循环中间终止,我看不到任何会“破坏”你的数据的东西,因为它是一个单一的查询,它要么成功要么失败。 . 介于两者之间。如果您希望能够在发生故障时再次运行您的脚本,您需要确定您停止的位置,因为再次运行会导致重复。

您可以手动执行此操作并适本地管理您的数据

您可以将它添加到您的 insert_place 方法中,这样如果该条目已经在数据库中,它将跳过 con.query(statement) 位。

关于mysql - 通过纯 Ruby、数据库连接向 MySQL 插入哈希,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18923676/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com