我已经设置了一个新的数据库,用于在PostgreSQL中安装Discourse.当我运行rake db:migrate时,它会创建大多数表,但它会失败:
-- execute("INSERT INTO archetypes (name_key, created_at, updated_at) VALUES ('poll', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)")
-> 0.0009s
-- add_column(:forum_threads, :archetype_id, :integer, {:default=>1, :null=>false})
-> 0.0209s
== CreateArchetypes: migrated (0.0424s) ======================================
== AddMetaDataToForumThreads: migrating ======================================
-- execute("CREATE EXTENSION IF NOT EXISTS hstore")
rake aborted!
An error has occurred, this and all later migrations canceled:
PG::Error: ERROR: could not open extension control file "/usr/share/postgresql/9.1/extension/hstore.control": No such file or directory
: CREATE EXTENSION IF NOT EXISTS hstore
/usr/local/rvm/gems/ruby-1.9.3-p385/bundler/gems/MiniProfiler-d149f34fcdb6/Ruby/lib/patches/sql_patches.rb:155:in `exec'
/usr/local/rvm/gems/ruby-1.9.3-p385/bundler/gems/MiniProfiler-d149f34fcdb6/Ruby/lib/patches/sql_patches.rb:155:in `async_exec'
/usr/local/rvm/gems/ruby-1.9.3-p385/gems/activerecord-3.2.12/lib/active_record/connection_adapters/postgresql_adapter.rb:652:in `block in execute' …Run Code Online (Sandbox Code Playgroud) 我有一个相当大的json文档,我必须存储在我的应用程序中的每个Evaluation实例的字段中.随着时间的推移,应用程序上的某些操作将要求我更改文档中的各种键/值对.Rails 4和PostgreSQL json数据类型似乎是这个问题的理想选择,但我无法对数据库进行更改.
这是一个缩写的工作流程:
我有一个json文件,我导入每个评估记录的字段:
// example.json
{ "question_1":"no" }
Run Code Online (Sandbox Code Playgroud)
我创建一个记录并导入json:
>> evaluation = Evaluation.create assessments: File.read("example.json")
>> evaluation.assessments = File.read("#{Rails.root}/example.json")
=> "{ \"question_1\":\"no\" }"
Run Code Online (Sandbox Code Playgroud)
调用评估字段似乎工作正常:
>> evaluation.assessments
=> {"question_1"=>"no"}
OR
>> evaluation.assessments["question_1"]
=> "no"
Run Code Online (Sandbox Code Playgroud)
改变json不是很好.这实际上没有提交任何东西:
>> evaluation.assessments["question_1"] = "yes"
=> "yes"
>> evaluation.assessments["question_1"]
=> "yes"
>> evaluation.save
(0.3ms) BEGIN
(0.2ms) COMMIT
=> true
Run Code Online (Sandbox Code Playgroud)
替换为一个全新的对象确实提交:
>> evaluation.assessments = {"question_1"=>"yes"}
=> {"question_1"=>"yes"}
>> evaluation.save
(0.3ms) BEGIN
SQL (0.7ms) UPDATE "evaluations" SET "assessments" = $1, "updated_at" = $2 …Run Code Online (Sandbox Code Playgroud) 我在Rails 4.1中使用HStore来管理I18n和语言存储.它工作得很好我唯一的问题是我想做这样的事情(而不是使用store_accessor)
在Rails 4.0中,这很有用:
https://gist.github.com/rf-/2322543(simple_form和hstore基本功能)
所以我可以简单地做一些事情:
validates_hstore :content do
validates_presence_of :en
end
Run Code Online (Sandbox Code Playgroud)
魔法发生的地方(似乎在Rails 4.1中无法正常工作)
module HstoreValidation
def validates_hstore(field, &block)
validation_class = Class.new do
include ActiveModel::Validations
def self.name
'(validations)'
end
def initialize(data)
@data = data
end
def read_attribute_for_validation(attr_name)
@data[attr_name]
end
end
validation_class.class_eval &block
validate do
validator = validation_class.new(self[field])
if validator.invalid?
validator.errors.each do |attr, text|
self.errors.add(attr, text)
end
end
end
end
end
Run Code Online (Sandbox Code Playgroud)
相反,我总是得到,即使字段不是空白:
messages:
:en:
- can't be blank
Run Code Online (Sandbox Code Playgroud) postgresql ruby-on-rails hstore ruby-on-rails-4 ruby-on-rails-4.1
我在使用Hstore和动态访问器克服Rails 4中新的强params要求时遇到了问题
我有一个Hstore列:content,我想用它来存储多种语言的内容,即:en, :fr等等.我不知道在模型或控制器中预先设置哪种语言.
store_accessor :content, [:en, :fr] #+226 random other il8n languages won't work.
Run Code Online (Sandbox Code Playgroud)
如何在一个列的rails 4中覆盖强params(或允许动态hstore键)?
params.require(:article).permit(
:name, :content,
:en, :fr #+226 random translations
)
Run Code Online (Sandbox Code Playgroud)
缺乏...
params.require(:article).permit!
Run Code Online (Sandbox Code Playgroud)
这当然有效.
有没有办法使用PostgreSQL json/hstore JdbcTemplate?esp查询支持.
例如:
hstore:
INSERT INTO hstore_test (data) VALUES ('"key1"=>"value1", "key2"=>"value2", "key3"=>"value3"')
SELECT data -> 'key4' FROM hstore_test
SELECT item_id, (each(data)).* FROM hstore_test WHERE item_id = 2
Run Code Online (Sandbox Code Playgroud)
为Json
insert into jtest (data) values ('{"k1": 1, "k2": "two"}');
select * from jtest where data ->> 'k2' = 'two';
Run Code Online (Sandbox Code Playgroud) 我有一个迁移,我创建一个像这样的产品表
class CreateProducts < ActiveRecord::Migration
def change
create_table :products do |t|
t.string :name
t.hstore :data
t.timestamps
end
end
end
Run Code Online (Sandbox Code Playgroud)
在activerecord-postgres-hstore页面上,他们使用表格(在SQL中)添加索引
CREATE INDEX products_gin_data ON products USING GIN(data);
Run Code Online (Sandbox Code Playgroud)
但是,迁移不会跟踪这种变化(我猜是因为它是Postgres特定的吗?),有没有办法从迁移中创建索引?
谢谢!
hstore文档仅讨论了一次使用"插入"到一行的hstore.反正有没有批量上传几个100k行,可能是兆字节或Gigs到postgres hstore.
复制命令似乎仅适用于上载csv文件列
有人可以发一个例子吗?优选地,使用python/psycopg的解决方案
我一直在评估PostgreSQL的hstore功能(9.2),而精细手册中唯一没有明确指出的是如何重命名密钥.例如,我怎样才能将密钥重命名c为ai_count?
"c"=>"3", "ai_voltage"=>"3", "ai_temperature"=>"28"
我认为没有直接的方法可以做到这一点,它涉及将c密钥复制到ai_count密钥,然后丢弃c密钥.我怎么能这样做,理想情况下作为一个可以应用于多个记录的单行程?
我有一个Rails应用程序,它汇集了来自Google API的大量数据.我目前在MongoDB中存储JSON响应(所以我的Rails应用程序同时包含pg和mongo).但是,今天,我遇到了PostgreSQL Hstore扩展,我决定尝试一下.
不幸的是,我遇到了一个问题.API提供的JSON是多层深度的,因此Ruby Hash JSON.parse包含哈希,其中包含新的哈希值.但是,Hstore是字符串键/值存储,它只有1级深度.所以第一个哈希中的哈希就变成了字符串.
我发现真正令人讨厌的黑客攻击eval是变成字符串的哈希:
eval("{ "foo" => "bar" }")
Run Code Online (Sandbox Code Playgroud)
我不喜欢这个.有关怎么做的提示?我应该继续使用MongoDB还是有更好的方法在PG中存储多级深度哈希值?
我正在开发一个需要hstore在多个模式上使用的项目.hstore安装扩展程序的"公共"模式无处不在,因为我的作用域不在"公共"中查找.在一些试用版中,我在名为"hstore"的模式上创建了扩展,并在所使用的每个可用范围(搜索路径)上使用了模式.
基于此,我有一些问题:
是否可以为扩展创建架构?或者是它更好地在每一个方案中创建的扩展(如,customer_1,customer_2,等...)?
在单独的模式中创建扩展是否会影响数据的存储位置?我正在使用多个模式来使备份/恢复更容易,并且实际上不希望pg将我的所有hstore数据存储pg_large_objects在单个模式的隐藏表(例如blob)中.
hstore ×10
postgresql ×8
discourse ×1
indexing ×1
java ×1
jdbctemplate ×1
json ×1
migration ×1
spring ×1
ubuntu ×1