Tag: sql

咨询锁或NOWAIT以避免等待锁定的行?

在我的Rails 4应用程序中,我对Postgres 9.4数据库进行了此查询: @chosen_opportunity = Opportunity.find_by_sql( ” UPDATE \”opportunities\” s SET opportunity_available = false FROM ( SELECT \”opportunities\”.* FROM \”opportunities\” WHERE ( deal_id = #{@deal.id} AND opportunity_available = true AND pg_try_advisory_xact_lock(id) ) LIMIT 1 FOR UPDATE ) sub WHERE s.id = sub.id RETURNING sub.prize_id, sub.id” ) 非常受dba.SE相关答案的启发 。 我只是希望我的查询找到并更新第一个(随机,带LIMIT )行,其中available = true并将其更新为available = false ,我需要在执行此操作时锁定该行,但不要让新请求等待发布之前的锁定,因为有许多并发调用将使用此查询。 […]

Postgres使用CSV数据从变量复制

我知道你可以从文件中运行这样的复制命令: “COPY zip_codes FROM ‘/path/to/csv/ZIP_CODES.txt’ DELIMITER ‘,’ CSV;” 我想从ruby变量中复制csv数据,所以我可以这样做 “COPY zip_codes FROM ‘#{csv_data}’ DELIMITER ‘,’ CSV;”

ActiveRecord查找 – 跳过记录或获取每个第N条记录

我想在一个查询中选择一堆数据,但我希望能够通过仅选择每三个记录,甚至每百个记录来降低该数据的分辨率,或者随你。 使用ActiveRecord有什么简单的方法吗?

查询包含JSON对象数组的jsonb列

我使用PostgreSQL 9.5和Rails 5.我想查询下面显示的jsonb列,它包含一个JSON对象数组,以返回包含{“kind”:”person”}所有JSON数组元素,并执行计数。 我使用的SQL显示在json数据下面。 运行查询只返回一个空数组。 我已经尝试了这里和这里建议的查询。 这就是我的jsonb数据: ‘[ {“kind”:”person”, “filter_term”:”56″,”selected_attr”:”customer”}, {“kind”:”email”, “filter_term”:”marketer”,”selected_attr”:”job_title”} ]’ 我想要一个sql查询返回: data ———————————————————————- ‘{“kind”:”person”, “filter_term”:”56″,”selected_attr”:”customer”}’ (1 row) 和另一个返回数组的查询,以便我可以在我的应用程序中调用count并在其上循环以创建表单: data ———————————————————————- ‘[{“kind”:”person”, “filter_term”:”56″,”selected_attr”:”customer”}]’ (1 row) 我试过这个SQL查询: “SELECT * FROM \”segments\” WHERE (payload @> ‘[{\”kind\”:\”person\”}]’)” 我也试过这个查询: “SELECT payload FROM segments WHERE payload @> ‘[{\”kind\”:\”person\”}]’::jsonb;” 这是第三个查询: “SELECT * FROM segments s WHERE s.payload->’\”#{a}\”‘ @> ‘[{\”kind\”:\”person\”}]’;” […]

Rails,Ransack:如何在“所有”匹配中搜索HABTM关系而不是“任何”

我想知道是否有人有使用Ransack与HABTM关系的经验。 我的应用程序的photos与terms有关系(术语类似于标签)。 这是我正在经历的简化说明: 我有两张照片:照片1和照片2.他们有以下条款: 照片1:A,B,C 照片2:A,B,D 我构建了一个搜索表单,并在搜索表单中为所有术语创建了复选框,如下所示: – terms.each do |t| = check_box_tag ‘q[terms_id_in][]’, t.id 如果我使用: q[terms_id_in][]并且我检查“A,C”我的结果是照片1和照片2.我只想要照片1,因为我要求A和C,在这个查询中我不关心B或D但我希望A和C都出现在给定的结果上。 如果我使用q[terms_id_in_all][]我的结果是零,因为q[terms_id_in_all][]照片都不包含A和C.或者,也许,因为每个连接只有一个术语,所以没有连接匹配A和C.无论如何,我只想要照片1将被退回。 如果我使用任何种类的q[terms_id_eq][]我从来没有得到任何结果,所以我认为这不适用于这种情况。 因此,给定一个habtm连接,如何在忽略未给定值的同时搜索与给定值匹配的模型? 或者,对于任何不熟悉Ransack的rails / sql专家,你怎么可能去创建一个搜索表单,比如我正在描述一个带有habtm连接的模型? 更新:根据相关问题的答案 ,我现在已经建立了一个正确匹配它的Arel查询。 不知何故,你应该能够使用Arel节点作为搜索者,或者像cdesrosiers所指出的那样,作为自定义谓词,但到目前为止我还没有得到这样的工作。 根据该答案,我设置了以下ransack初始化程序: Ransack.configure do |config| config.add_predicate ‘has_terms’, :arel_predicate => ‘in’, :formatter => proc {|term_ids| Photo.terms_subquery(term_ids)}, :validator => proc {|v| v.present?}, :compounds => true end …然后在Photo上设置以下方法: def self.terms_subquery(term_ids) photos = Arel::Table.new(:photos) […]

Rails SQL查询与find

我希望使用find在rails控制器中编写这个SQL查询: select id,name from questions where id not in (select question_id from levels_questions where level_id=15) 我该怎么做? 我正在使用Rails框架和MySQL。 提前致谢。

按重复属性分组

基本上我有一个表messages , user_id字段标识创建消息的用户。 当我在两个用户之间显示一个对话(一组消息)时,我希望能够通过user_id对消息进行分组,但这是一种棘手的方式: 假设有一些消息(按created_at desc排序): id: 1, user_id: 1 id: 2, user_id: 1 id: 3, user_id: 2 id: 4, user_id: 2 id: 5, user_id: 1 我希望按以下顺序获得3个消息组: [1,2], [3,4], [5] 它应该按* user_id *分组,直到它看到另一个,然后按那个分组。 我正在使用PostgreSQL,并乐于使用特定的东西,无论什么能带来最佳性能。

Rails虚拟属性搜索或sql组合列搜索

我有一个属性’first’和’last’的用户模型所以例如User.first.first#=>“Charlie”User.first.last#=>“Brown” 此用户模型还具有虚拟属性“full_name” #user.rb def full_name [first,last].join(‘ ‘) end def full_name=(name) #don’t know what to do with people w/ middle names split = name.split(‘ ‘) self.first = split[0] self.last = split[1] end 例如: User.first.full_name = “Charlie Brown” #=> “Charlie Brown” User.first.full_name = “Homer Simpson” #=> “Home Simpson” User.first.save User.first.first #=> “Homer” User.first.last #=> “Simpson” 如果我可以通过该虚拟属性进行搜索,例如动态查找,那就太好了: User.find_by_full_name(‘Home […]

将pg_try_advisory_xact_lock()放在嵌套的子查询中?

在我的Ruby on Rails 4应用程序中,我对Postgres 9.4数据库进行了此查询: @chosen_opportunity = Opportunity.find_by_sql( ” UPDATE \”opportunities\” s SET opportunity_available = false FROM ( SELECT \”opportunities\”.* FROM \”opportunities\” WHERE ( deal_id = #{@deal.id} AND opportunity_available = true AND pg_try_advisory_xact_lock(id) ) LIMIT 1 FOR UPDATE ) sub WHERE s.id = sub.id RETURNING sub.prize_id, sub.id” ) 非常受dba.SE相关答案的启发 。 但是这里( Postgres pg_try_advisory_lock会阻止所有记录 )他们说,如果我没弄错的话,我不应该在WHERE子句中使用pg_try_advisory_lock() ,因为我会在扫描的整个集合中每行调用一次 […]

rails scope来检查关联是否不存在

我期待编写一个范围,返回所有没有特定关联的记录。 foo.rb class Foo < ActiveRecord::Base has_many :bars end bar.rb class Bar < ActiveRecord::Base belongs_to :foo end 我想要一个范围,可以找到所有没有任何bars的Foo’s 。 很容易找到使用joins的关联,但我没有找到相反的方法。