使用ruby将JSON中的内容保存到数据库中

使用ruby将JSON中的内容保存到数据库中,ruby,json,database,Ruby,Json,Database,我有一个json文件,如下所示: {"business_id": "vcNAWiLM4dR7D2nwwJ7nCA", "full_address": "4840 E Indian School Rd\nSte 101\nPhoenix, AZ 85018", "hours": {"Tuesday": {"close": "17:00", "open": "08:00"}, "Friday": {"close": "17:00", "open": "08:00"}, "Monday": {"clo

我有一个json文件,如下所示:

{"business_id": "vcNAWiLM4dR7D2nwwJ7nCA", "full_address": "4840 E Indian School Rd\nSte 101\nPhoenix, AZ 85018", "hours": {"Tuesday": {"close": "17:00", "open": "08:00"}, "Friday": {"close": "17:00", "open": "08:00"}, "Monday": {"close": "17:00", "open": "08:00"}, "Wednesday": {"close": "17:00", "open": "08:00"}, "Thursday": {"close": "17:00", "open": "08:00"}}, "open": true, "categories": ["Doctors", "Health & Medical"], "city": "Phoenix", "review_count": 7, "name": "Eric Goldberg, MD", "neighborhoods": [], "longitude": -111.98375799999999, "state": "AZ", "stars": 3.5, "latitude": 33.499313000000001, "attributes": {"By Appointment Only": true}, "type": "business"}
{"business_id": "JwUE5GmEO-sH1FuwJgKBlQ", "full_address": "6162 US Highway 51\nDe Forest, WI 53532", "hours": {}, "open": true, "categories": ["Restaurants"], "city": "De Forest", "review_count": 26, "name": "Pine Cone Restaurant", "neighborhoods": [], "longitude": -89.335843999999994, "state": "WI", "stars": 4.0, "latitude": 43.238892999999997, "attributes": {"Take-out": true, "Good For": {"dessert": false, "latenight": false, "lunch": true, "dinner": false, "breakfast": false, "brunch": false}, "Caters": false, "Noise Level": "average", "Takes Reservations": false, "Delivery": false, "Ambience": {"romantic": false, "intimate": false, "touristy": false, "hipster": false, "divey": false, "classy": false, "trendy": false, "upscale": false, "casual": false}, "Parking": {"garage": false, "street": false, "validated": false, "lot": true, "valet": false}, "Has TV": true, "Outdoor Seating": false, "Attire": "casual", "Alcohol": "none", "Waiter Service": true, "Accepts Credit Cards": true, "Good for Kids": true, "Good For Groups": true, "Price Range": 1}, "type": "business"}
我正在使用以下命令对其进行解析:

require 'json'

req_hash = File.read("test123.json").split("\n").map do |line|
         JSON.parse(line)
       end

a = req_hash.first

我想将这个json文件中“business_id”、“review”和“有用”属性下的内容保存到数据库中。如何使用Ruby做到这一点?一个流行的持久性gem是。它处理所有流行的SQL数据库。 根据您使用的数据库,您可能需要安装gem来处理该数据库

下面是一个示例脚本,它设置内存中的sqlite数据库,向其中插入一些数据,然后读取这些数据

require 'json'
require 'sequel'

input = [
  '{"business_id": "vcNAWiLM4dR7D2nwwJ7nCA", "full_address": "4840 E Indian School Rd\nSte 101\nPhoenix, AZ 85018", "hours": {"Tuesday": {"close": "17:00", "open": "08:00"}, "Friday": {"close": "17:00", "open": "08:00"}, "Monday": {"close": "17:00", "open": "08:00"}, "Wednesday": {"close": "17:00", "open": "08:00"}, "Thursday": {"close": "17:00", "open": "08:00"}}, "open": true, "categories": ["Doctors", "Health & Medical"], "city": "Phoenix", "review_count": 7, "name": "Eric Goldberg, MD", "neighborhoods": [], "longitude": -111.98375799999999, "state": "AZ", "stars": 3.5, "latitude": 33.499313000000001, "attributes": {"By Appointment Only": true}, "type": "business"}',
  '{"business_id": "JwUE5GmEO-sH1FuwJgKBlQ", "full_address": "6162 US Highway 51\nDe Forest, WI 53532", "hours": {}, "open": true, "categories": ["Restaurants"], "city": "De Forest", "review_count": 26, "name": "Pine Cone Restaurant", "neighborhoods": [], "longitude": -89.335843999999994, "state": "WI", "stars": 4.0, "latitude": 43.238892999999997, "attributes": {"Take-out": true, "Good For": {"dessert": false, "latenight": false, "lunch": true, "dinner": false, "breakfast": false, "brunch": false}, "Caters": false, "Noise Level": "average", "Takes Reservations": false, "Delivery": false, "Ambience": {"romantic": false, "intimate": false, "touristy": false, "hipster": false, "divey": false, "classy": false, "trendy": false, "upscale": false, "casual": false}, "Parking": {"garage": false, "street": false, "validated": false, "lot": true, "valet": false}, "Has TV": true, "Outdoor Seating": false, "Attire": "casual", "Alcohol": "none", "Waiter Service": true, "Accepts Credit Cards": true, "Good for Kids": true, "Good For Groups": true, "Price Range": 1}, "type": "business"}'
].join("\n")

class Migration
  def migrate!(db, table_name)
    db.create_table?(table_name) do |db|
      primary_key :id
      String :business_id
      # Add other columns here
    end
  end
end

table_name = :reviews
database = Sequel.sqlite

Migration.new.migrate!(database, table_name)

Review = Class.new(Sequel::Model(:reviews))

class DbWriter

  def write_review(hash)
    data = extract_data(hash)
    Review.create(data)
  end

  def extract_data(input)
    {}.tap do |output|
      output[:business_id] = input["business_id"]
      # Insert other wanted data
    end
  end

end

writer = DbWriter.new

input.split("\n").each do |data|
  parsed = JSON.parse(data)
  writer.write_review(parsed)
end

puts Review.all.inspect

# => [
#     #<Review @values={:id=>1, :business_id=>"vcNAWiLM4dR7D2nwwJ7nCA"}>,
#     #<Review @values={:id=>2, :business_id=>"JwUE5GmEO-sH1FuwJgKBlQ"}>
#    ]
require'json'
需要“续集”
输入=[
“{”business_id:“{”vcnawim4dr7d2nwwj7nca“,”完整地址“:”4840 E印第安学校路101\nPhoenix,亚利桑那州85018“,”小时“:{”星期二“{”关闭“:”17:00”,“开放“:”08:00“,”星期五“{”关闭“:”17:00”,“开放“:”08:00“,”星期一“,”星期三“{”关闭“:”17:00”,“开放“:”08:00“,”星期四“{”关闭“,”17:00”,“开放”:“08:00”},“开放”:真,“类别”:[“医生”,“健康与医疗”],“城市”:“凤凰城”,“回顾计数”:7,“姓名”:“埃里克·戈德伯格,医学博士”,“社区”:[],“经度”:-111.983757999999999,“州”:“AZ”,“星”:3.5,“纬度”:33.49931300000001,“属性”:{“仅限预约”:真,,“类型”:“业务”},
“{”business_id:“JwUE5GmEO-sH1FuwJgKBlQ”,“完整地址:“{}美国51号公路6162号,WI 53532”,“小时:{},“开放”:true,“类别:“[”餐厅“],”城市“:”森林“,”回顾计数“,”26,“名称“:”松果餐厅“,”社区“:[]”,经度“:-89.3358439999994,”州“:“WI”,“星星“,”4.0”,“纬度“:”43.238892999997,”属性:{“外卖”:真,“适合”:{“甜点”:假,“深夜”:假,“午餐”:真,“晚餐”:假,“早餐”:假,“早午餐”:假},“餐饮”:假,“噪音级”:“平均”,“接受预定”:假,“递送”:假,“氛围”:{“浪漫”:假,“亲密”:假,“旅游”:假,“时髦”:假,“迪维”:假,““停车场”{“车库”;“街道”;“验证”;“停车场”;“停车场”;“停车场”;“停车场”;“停车场”;“停车场”;“停车场”;“停车场”;“停车场”;“停车场”;“停车场”;“停车场”;“停车场”;“停车场”;“停车场”;“停车场”;“停车场”;“停车场”;“停车场”;“停车场”;“停车场”;“停车场”;“停车场”;“停车场”;“停车场”;“停车场价格范围“:1}”,类型“:“业务”}”
].join(“\n”)
阶级迁移
def迁移!(数据库,表名称)
db.create_table?(table_name)do|db|
主键:id
字符串:business\u id
#在此处添加其他列
结束
结束
结束
表_name=:评论
数据库=Sequel.sqlite
Migration.new.migrate!(数据库,表名)
Review=Class.new(Sequel::Model(:reviews))
类DbWriter
def write_review(散列)
数据=提取数据(散列)
查看。创建(数据)
结束
def提取_数据(输入)
{}.点击do |输出|
输出[:业务id]=输入[“业务id”]
#插入其他需要的数据
结束
结束
结束
writer=DbWriter.new
input.split(“\n”)。每个do数据|
parsed=JSON.parse(数据)
writer.write_review(已解析)
结束
把Review.all.inspect放进去
# => [
##1,:business_id=>“vcnawim4dr7d2nwwj7nca”}>,
##2,:business_id=>“JwUE5GmEO-sH1FuwJgKBlQ”}>
#    ]

您可以使用MongoDB,它将文档存储为JSON。下面是一些基本代码,用于连接到数据库并写入和检索条目(假设
业务id
是唯一的)

ruby界面的美妙之处在于,输入和输出的都是列表和散列,因此您可以直接使用它们

注意,您需要运行
mongod
(mongo守护进程)


什么数据库?你自己做过什么?我的JSON文件非常大,我有来自同一个数据库的多个评论,所以我尝试对上述属性执行一些操作,并将它们存储在另一个数据库中,这样我就可以用相同的业务id匹配评论。然后我需要执行rm对它们进行了更多的操作。我已经寻找了很长一段时间,但我找不到任何方法。我曾考虑使用mySql之类的东西,但我是ruby noob,所以我不确定如何操作。ruby和数据库上有很多资源,你试过谷歌搜索吗?正如我所说的““我现在一直在寻找很多”,我试着用谷歌搜索,但什么也找不到,这就是我为什么要问这个问题。我现在有很多关于ruby和数据库的资源,但除了datamapper之外,我找不到任何帮助,但我不确定这是否正确。这个模块不是一个类吗?
require 'mongo'

class MongoWriter
  def initialize(host='localhost', port=27017)
    @mongo_client = MongoClient.new(host, port) #connect to the dbhost
    @db = @mongo_client.db("test")              #connect to your database
    @posts = @db["posts"]                       #connect to your collection
  end

  def writepost(post, comments=[])
    #write the entry if "business_id" doesn't exist
    @posts.insert(post) if @posts.find_one({"business_id"=>post["business_id"]}) == nil
  end

  def find(business_id)
    #find a post with "business_id"
    @posts.find_one({"business_id"=>post["business_id"]})
  end
end