Tag: postgresql

postgresql,奇怪的OFFSET / LIMIT行为(记录顺序)

所以基本上我有这个范围(sql): scope.to_sql => “SELECT \”offers\”.* FROM \”offers\” INNER JOIN \”cities_offers\” ON \”offers\”.\”id\” = \”cities_offers\”.\”offer_id\” WHERE \”cities_offers\”.\”city_id\” = 2 AND \”offers\”.\”category_id\” IN (2) AND (offers.category_id is NOT NULL) ORDER BY offers.discount desc LIMIT 25 OFFSET 0″ 不知何故,上述查询的记录顺序不同,而且没有LIMIT和OFFSET的记录顺序不同: scope[6] => # #<Offer id: 8729 … 8629和8729记录都具有相同的discount值(我订购的属性)。 如果可以在这些情况下保持相同的记录顺序,请您提供建议吗?

保存到PostgreSQL时,二进制数据变得笨拙

我会让这个irb会话进行说话(垃圾省略…. )。 使用一些Marshalled数据创建模型。 user_info是二进制列 irb(main):011:0> p2 = Provider.create(user_info: Marshal.dump(ActiveSupport::HashWithIndifferentAccess.new({foo: 1, bar: 2})) (0.7ms) BEGIN SQL (11.6ms) INSERT INTO “providers” (….”user_info”) VALUES (….$9) RETURNING “id” […..[“user_info”, “\x04\bC:-ActiveSupport::HashWithIndifferentAccess{\aI\”\bfoo\x06:\x06EFi\x06I\”\bbar\x06;\x06Fi\a”]] (3.6ms) COMMIT => # 检查值。 看起来正确: irb(main):013:0> p2.user_info => “\x04\bC:-ActiveSupport::HashWithIndifferentAccess{\aI\”\bfoo\x06:\x06EFi\x06I\”\bbar\x06;\x06Fi\a” 糟糕的事情发生了:在这里我重新加载它,价值完全变成Marshal无法加载的格式 irb(main):014:0> p2.reload Provider Load (5.3ms) SELECT “providers”.* FROM “providers” WHERE “providers”.”id” = $1 LIMIT 1 [[“id”, 98]] => […]

使用Rails 4(和Hstore)在PostgreSQL中存储嵌套的哈希

我有一个Rails应用程序,它汇集了来自Google API的大量数据。 我目前在MongoDB中存储JSON响应(因此我的Rails应用程序同时包含pg和mongo)。 但是,今天,我遇到了PostgreSQL Hstore扩展,我决定尝试一下。 不幸的是,我遇到了一个问题。 API提供的JSON是多层深度的,因此JSON.parse之后的Ruby Hash包含哈希,其中包含新的哈希值。 但是, Hstore是字符串键/值存储,它只有1级深度。 所以第一个哈希中的哈希就变成了字符串。 我发现真正讨厌的黑客是eval变成字符串的哈希: eval(“{ “foo” => “bar” }”) 我不喜欢这个。 关于该怎么做的任何提示? 我应该继续使用MongoDB还是有更好的方法在PG中存储多级深度哈希值?

如何在双边市场中构建关系表

我真的很想解决这个问题,会喜欢一些额外的想法。 这是基本的背景: Users既可以列出要借出的items ,也可以requests借用物品 Requests由想要借用某些内容的users发布。 每个request可能包含多个items Items是预定义的(即,POST表单是一个复选框),并由想要借出它们的users列出,然后由提交request其他users借用 工作流程: John是一名用户,并从6/5到6/8提交帐篷请求 控制器会查找拥有6/5到6/8可用帐篷的所有用户(除了John) 联系此用户列表以查看谁想为John提供帐篷 无论谁对约翰作出肯定回应,其表中的项目自动更新为6/5至6/8不再可用 John和其他用户连接以进行交换 到目前为止我的想法: Users表has_many :items和has_many :requests Requests表belongs_to :users Items表belongs_to :users 我的大脑无法处理的额外复杂性: 一个request可以包含多个items ,并且我被告知不要在一个单元格中接受items作为序列化数组,因此我不确定如何关联request和item 。 在上表中, items也belong_to requests ? 如果是的话,这似乎意味着user必须request特定item而我希望用户能够搜索帐篷,并查看所有可用帐篷的用户列表 Requests包含start_date和end_date属性,这些属性需要与item可用时进行比较。 现在我在items表中思考,需要有一个列存储项目将被使用的日期(即,不可用)。 但是这个数据将再次成为一个数组。 例如,可以请求帐篷(并且用户响应OK)从6/5到6/8,然后再从6/10到6/15,然后再从7/8到7/9。 所以我需要第四张桌子吗? Items将是预定义的列表,例如帐篷,睡袋,睡垫。 通过这种方式,我想知道我实际上需要与users建立has_and_belongs_to_many关系,因为帐篷可能属于许多用户,而用户可能有很多帐篷。 对不起,如果这听起来像是一个漫步…我已经坐在这里4个小时,有很多纸和涂鸦,这没有更清楚……

ActiveRecord :: StatementInvalid:PG ::错误:错误:无法在Heroku中的只读事务错误中执行UPDATE

我使用关注者在Heroku上创建了一个新数据库。 在它提交0后,我取消关注主数据库并将其作为默认值提升。 似乎工作正常,但看起来只读。 当我尝试从控制台中删除记录时,我看到了这个错误 ActiveRecord::StatementInvalid: PG::Error: ERROR: cannot execute UPDATE in a read-only transaction 知道怎么解决这个问题吗?

获取每个组的第一条记录列表

我有一个包含以下列的Log模型: [“id”, “username”, “event”, “parameters”, “extras”, “created_at”, “updated_at”] 现在,我想获取created_at命令的每个username的第一个日志。 一种方法是为每个用户名运行以下查询: log = Log.where(“username = :username”, username: username).order(:created_at).first 但这显然会多次查询数据库(等于用户名的数量)。 有没有办法只做一个数据库查询?

如何在Postgres中进行查询以按月创建分组记录? (:created_at datetime列)

我有这个Ruby代码: def visits_chart_data(domain) last_12_months.collect do |month| { created_at: month, count: domain.visits.created_on_month(month).count } end end def last_12_months (0..11).to_a.reverse.collect{ |month_offset| month_offset.months.ago.beginning_of_month } end CreatedOnMonth只是一个范围: scope :created_on_month, -> (month = Time.now) { where{ (created_at >= month.beginning_of_month) & (created_at <= month.end_of_month) } } created_at只是一个标准的日期时间戳。 如何优化它以进行一次查询而不是12? 我看到有些人使用GROUP_BY,但是我对PostgreSQL不太好,能够自己构建这样的查询。 查询应按年份对记录进行分组并返回计数。 也许有人可以帮助我。 谢谢。

如何根据布尔值计算两次相同的字段?

我想通过自定义选择和连接来修复我的N + 1计数问题。 我的post和标签之间有多对多的关系。标签可以被确认或未经确认。 我想在我的postselect语句中包含字段tags_confirmed_count和tags_unconfirmed_count(所以我可以避免以后为每个问题计算标签)。 我已经为以下查询的post执行了计数标记: Post.joins(:tags).select(“posts.*, COUNT(tags.id) AS tags_count”).group(“posts.id”) 现在,对于将字段确认设置为true而一次为false的标记,我找不到计数标记的解决方案。 我试过这种方式,但是我这样我只计算确认的那些,但不是未经证实的那些: Post.joins(:tags).select(“posts.*, COUNT(tags.id) AS tags_confirmed_count”).group(“posts.id”).where(“tags.confirmed = true”)

为Heroku安装PostgreSQL gem pq

这里的第一个问题,但我现在非常感谢你,因为stackoverflow在michael hartl tut的第一章中帮了我近15次。 现在我正在尝试使用此命令安装PostgreSQL(pg gem): ` group :production do gem ‘pg’, ‘0.15.1’ gem ‘rails_12factor’, ‘0.0.2’ end` 但它显示出错误 -bash: group: command not found 然后我尝试直接安装(?)gem gem install pg 但它显示了另一个错误 `Fetching: pg-0.17.1.gem (100%) Building native extensions. This could take a while… ERROR: Error installing pg: ERROR: Failed to build gem native extension. rvm/rubies/ruby-2.0.0-p353/bin/ruby extconf.rb checking for pg_config… no […]

为Rails 4 / Postgres重新排序schema.rb中的列是否安全?

在开发和生产中使用Postgres 9.4运行Rails 4。 我有一张随着时间的推移而逐渐迁移的大桌子。 由于表中有许多不同的列,我想重新排序,以便更加逻辑地对列进行分组。 换句话说,一些列元素基于它们捕获的信息自然地组合在一起。 我发现了有关使用after:的讨论after:在迁移中重新排序列(在SQL中使用ALTER TABLE ),在此堆栈溢出讨论中 。 然后我继续设置迁移来做到这一点。 运行迁移后,我注意到我的schema.rb文件没有更改。 查看数据库中的列(开发后的postgres),也没有任何改变。 进一步的研究使我进入了Postgres维基 ,该维基表示目前不支持改变Postgres的柱位。 这不是关键任务,但它会让生活更轻松。 我的问题是: 如果我只是向上或向下移动schema.rb文件中的行以便根据需要定位它们,那会导致任何问题吗? 因为我希望使用rake db:schema:load来配置任何新数据库,所以看起来不应该破坏任何东西。 此外,由于先前的迁移没有实质性地改变(只是它们输出到schema.rb的列的顺序),一切都应该是内部一致的,不是吗? 如果这是一个坏主意,我可以简单地回到早期的迁移,将after: :some_column的语法添加到每个列元素,以便它们正确设置schema.rb文件吗? 我的假设是,当我从头开始使用种子数据重建我的生产数据库时,它将使用模式结构以所需顺序正确创建表。 现在它不是一个真正的,部署了最终用户的数据库,所以它似乎不是一个问题。 使用上面的选项#1似乎是最简单的解决方案,只要它不会破坏任何东西。