使用原始SQL将Ruby哈希值保存到PostgreSQL

4
如何使用SQL直接将ruby哈希表保存到Postgres?
我已经尝试过以下方法:
INSERT INTO "table" ("created_at", "key", "params") VALUES (now(), 'create', '{:sub => tralal}')

但是它将字符串插入到数据库中,我该如何像在保存对象时从ruby中那样插入哈希。

从rails执行插入的sql查询看起来像:

INSERT INTO "table" ("created_at", "key", "params") VALUES ($1, $2, $3) RETURNING "id"  [["created_at", Mon, 24 Feb 2014 18:53:58 UTC +00:00], ["key", "create"], ["parameters", "---\n:sub: tralal\n"]

我是一名有用的助手,可以为您翻译文本。

我试图通过SQL进行一些插入以获得更好的性能,但我无法弄清如何将哈希放入数据库中而不是字符串。

如果我使用转换成YAML,我会得到:

{:my => 'hash'}.to_yaml
 => "---\n:my: hash\n"

当我这样做时:

INSERT INTO "table" ("created_at", "key", "params") VALUES (now(), 'create', '---\n:my: hash\n')

然后当我尝试在Rails控制台中获取它时:

MyClass.last[:parameters].keys.first
 => "---\\n:my"

我得到的是---\\n:my而不是:my

PostgreSQL使用hstore来存储哈希。http://www.postgresql.org/docs/9.0/static/hstore.html - wurde
2个回答

1

看起来你的代码正在将哈希序列化为YAML格式,当你读取它时可以进行反序列化。你可以使用YAML.load进行反序列化,它会将序列化后的哈希转换回Ruby哈希。

要手动从数据库中读取yaml,你必须使用YAML进行解析:

更新:

当我执行以下操作时:

INSERT INTO "table" ("created_at", "key", "params") VALUES (now(), 'create', '---\n:my: hash\n')

我可以使用以下代码读取和解析它:

model = MyClass.last
params = YAML.load model.params
=> {:my=>"hash"}

谢谢您的回复。我已经得到了从数据库获取值的部分。我该如何将哈希序列化为行SQL能够理解并以此保存在数据库中的格式,而不更改读取值的任何内容,因为我已经有了这个位 serialize :params, Hash - HereToLearn
噢,好吧,如果你的模型中有那个声明,那么当你读取它时,ActiveRecord会为你反序列化它,你不需要做任何事情。 - DiegoSalazar

0

我不确定你为什么要这样做,但是:

INSERT INTO "table" ("created_at", "key", "params") VALUES (now(), 'create', '{:sub => tralal}')

应该是

INSERT INTO "table" ("created_at", "key", "params") VALUES (now(), 'sub',  'tralal')

如果您想要将您的键设置为“sub”,参数设置为“tralal”。

将实际哈希值存入数据库的唯一方法是使用字符串,而且您不会像上面那样分离值。应该像这样:

INSERT INTO "table" ("created_at", "hash") VALUES (now(), '{:sub => tralal}')

并在控制台中:

MyClass.last.hash

应该给你返回哈希值


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接