Ruby on rails 如何使用change\u列为rails迁移postgres中的hstore生成正确的sql
我需要让hstore在rails迁移中工作。我已经通过迁移启用了hstore,现在,我正在尝试生成正确的sql以使其正常工作,但当我运行db:migrate时,我会出现此错误Ruby on rails 如何使用change\u列为rails迁移postgres中的hstore生成正确的sql,ruby-on-rails,postgresql,hstore,Ruby On Rails,Postgresql,Hstore,我需要让hstore在rails迁移中工作。我已经通过迁移启用了hstore,现在,我正在尝试生成正确的sql以使其正常工作,但当我运行db:migrate时,我会出现此错误 C:\Sites\Peoples_Profiles>rails db:migrate rails aborted! SyntaxError: C:/Sites/Peoples_Profiles/db/migrate/20180407073155_add_hstore_hash_to_urls.rb:4: syntax
C:\Sites\Peoples_Profiles>rails db:migrate
rails aborted!
SyntaxError: C:/Sites/Peoples_Profiles/db/migrate/20180407073155_add_hstore_hash_to_urls.rb:4: syntax error, unexpected '\n', expecting =>
C:/Sites/Peoples_Profiles/db/migrate/20180407073155_add_hstore_hash_to_urls.rb:10: syntax error, unexpected end-of-input, expecting keyword_end
bin/rails:4:in `require'
bin/rails:4:in `<main>'
Tasks: TOP => db:migrate
(See full trace by running task with --trace)
所以我认为postgres在抱怨,因为它试图转换这个代码
所以在检查rails如何实际引入参数后,它看起来是这样的
["urls", "--- !ruby/hash:ActiveSupport::HashWithIndifferentAccess\nurl1: http://hello\nurl2: http://jack\nurl3: http://boo\nurl4: ''\nurl5: ''\n"]
不确定是否在数据库中看起来像这样,但我说有一个\n在那里导致了这个错误。我们必须进一步跟进
。。。我现在意识到\n将来自将散列序列化为YAML的转换。尝试将SELF.DOWN更改为SELF.ANNUAL
我认为它会解决问题,大概你从以下几点开始:
serialize :urls
在您的模型中,因此您的散列将作为YAML存储在数据库中。没有从YAML文本到hstore
的类型转换,因此您可以使用:
USING urls::hstore
不行。在PostgreSQL中没有可靠解析YAML的简单方法,因此您最好的选择是:
users.url
列重命名为users.yaml\u url
url
列,其中(最好)包含jsonb
类型,但如有必要,您可以使用hstore
jsonb
是未来的发展趋势,今后将得到更好的支持yaml\u URL
值读入Rubyh=YAML.load(YAML\u from\u db)
将该YAML字符串转换为散列h.to_JSON
)并将其放回数据库url
不为空,并删除yaml\u url
列ApplicationRecord.connection.raw\u connection
中找到这样的连接吗。我这样说是因为您不希望数据迁移以任何方式与模型交互,并且低级接口支持占位符,因此可以避免转义和引用问题
该过程假设您没有那么多数据,或者,在修复数据库时,您的应用程序可以脱机。如果不是这样的话,那么您需要在修复数据时维护这两种格式(添加一个新的
jsonb
列,在调用url
和url=
时在模型内部写入和读取这两种格式),然后稍后进行清理。并且您没有关闭行(参见第4行)你是什么意思?我不认为你需要关闭这行,我认为rails会自动关闭..我将尝试创建一个表,看看它是否刚刚迁移过来..好的,如果我这样做,add_column:users,:urlss,:hstore,default:{},null:false
并添加一个新的列,它可以工作,所以我认为它在更改和转换格式时有问题,所以你说我可以使用pg gem或ApplicationRecord.connection.raw\u connection
我在这方面找不到任何东西。我已经安装了pg gem。你说我可以在建立连接后运行所有这些代码。然后将我的ruby与sql混合以获得结果?您可以在ApplicationRecord.Connection.raw_Connection
中找到PG::Connection
,或者在迁移中只找到Connection.raw_Connection
。我在答案中链接到了pg
文档。然后,您必须使用SQL(获取数据并将新数据放回)和Ruby(解码YAML并编码为JSON)的组合,一行一行地手动修复所有问题。是的,这是一个丑陋的过程,但它是使用序列化
的必然结果。
serialize :urls
USING urls::hstore