标签: sequel

如何在Ruby :: Sequel中测试非null?

我想做点什么

User.select(...).where(:name != nil)
Run Code Online (Sandbox Code Playgroud)

没有写类似的东西

User.select(...).to_a.find_all {|user| user.name}
Run Code Online (Sandbox Code Playgroud)

我可以选择空值,但不能选择非空值.有没有诀窍,或者在Sequel的域外?

ruby sequel

11
推荐指数
3
解决办法
5510
查看次数

续集加入表但我有重叠的列名.我如何为这些列名称添加别名?

这是我加入两个表的代码:

DB.from(:sources).join(:payloads, :source_id => :id)
Run Code Online (Sandbox Code Playgroud)

表名是:sources,:payloads.

问题是:id有效负载中有一列覆盖了:id:sources.我需要使用别名,以便我只获取包含所有列名称的超级表.但是,正如当前编写的那样,并且我的表当前是结构化的,:id列正在合并,第二个表优先.这有意义吗?

如何创建别名以使:id:sources仍然显示?

ruby sequel

11
推荐指数
2
解决办法
2760
查看次数

在连接之前定义续集模型

在我的(非Rails)应用程序中,我正在尝试定义一个续集模型:

class Foo < Sequel::Model
end
Run Code Online (Sandbox Code Playgroud)

当我运行我的应用程序时,我收到错误:

No database associated with Sequel::Model: 
have you called Sequel.connect or Sequel::Model.db= ? (Sequel::Error)
Run Code Online (Sandbox Code Playgroud)

事实上,我没有调用connect,因为'require Foo'在我的数据库代码运行之前发生.

当然,我可以切换一些东西,以便在数据库连接后完成需求,但还有其他选择吗?目前我在一个文件中拥有我所有应用程序的'require'语句,如果不必为这些模型类文件打破它,那将是很好的.

ruby sequel

10
推荐指数
1
解决办法
2596
查看次数

如何将Ruby Sequel日志记录设置为DEBUG级别?

默认的Ruby Sequel行为是在INFO级别记录所有数据库查询(与在DEBUG级别记录的ActiveRecord不同).我该如何改变?

ruby logging sequel

9
推荐指数
1
解决办法
4478
查看次数

怎么写得更好?Ruby Sequel链接OR

在SQL中它应该如下所示:

SELECT * FROM `categories_description_old` WHERE ((`categories_description` = '') OR (`categories_name` = '') OR (`categories_heading_title` = ''))
Run Code Online (Sandbox Code Playgroud)

我(丑陋)的解决方案:

conditions = [:categories_name, :categories_heading_title, :categories_description]
b = table_categories_description_old.filter(conditions.pop => "")
conditions.each do |m|
 b = b.or(m => "")
end
Run Code Online (Sandbox Code Playgroud)

是否有更好的解决方案来链接或条件?

ruby chaining sequel

9
推荐指数
2
解决办法
2036
查看次数

如何使用续集创建数据库

我已经阅读了所有续集的文档,但我找不到创建数据库的方法,假设我能做到这一点.

我正在运行一个rake任务:

require 'rubygems'
require 'bundler/setup'

require 'pg'
require 'sequel'

require 'yaml'
require 'erb'


namespace :db do

  task :connect do

  end


  task :create => :connect do

    puts db_config

    Sequel.connect(db_config['production']){ |db|

      db.create_table :user do
        primary_key :id

        String :name
        String :email

      end

      user = db[:user]


      user.insert(:name => 'Roland', :email => 'rolandjitsu@gmail.com')
    }

  end

  task :drop => :connect do

  end

end

def db_config
  YAML.load(ERB.new(File.read('config/database.yml')).result)
end
Run Code Online (Sandbox Code Playgroud)

但显然如果数据库不存在则不会创建数据库,所以我有点不确定我能做些什么.当我运行任务时,我得到:

PG::ConnectionBad: FATAL:  database "pulsr" does not exist
Run Code Online (Sandbox Code Playgroud)

database.yml文件:

production: &production
  adapter: postgres
  host: …
Run Code Online (Sandbox Code Playgroud)

ruby postgresql sequel

9
推荐指数
2
解决办法
5488
查看次数

无法从Sequel gem连接mysql

当我尝试从Sequel连接MySQL时.我收到这些错误:

require 'rubygems'
        require 'sequel'
        DB = Sequel.connect(:adapter => 'mysql', :user => 'root', :host => 'localhost', :database => 'scanty',:password=>'xx')
        DB.tables
    Sequel::DatabaseConnectionError: NameError uninitialized constant Mysql::CLIENT_MULTI_RESULTS
        from /opt/local/lib/ruby/gems/1.8/gems/sequel-3.2.0/lib/sequel/adapters/mysql.rb:98:in `connect'
        from /opt/local/lib/ruby/gems/1.8/gems/sequel-3.2.0/lib/sequel/database.rb:92:in `initialize'
        from /opt/local/lib/ruby/gems/1.8/gems/sequel-3.2.0/lib/sequel/connection_pool.rb:166:in `call'
        from /opt/local/lib/ruby/gems/1.8/gems/sequel-3.2.0/lib/sequel/connection_pool.rb:166:in `make_new'
        from /opt/local/lib/ruby/gems/1.8/gems/sequel-3.2.0/lib/sequel/connection_pool.rb:153:in `available'
        from /opt/local/lib/ruby/gems/1.8/gems/sequel-3.2.0/lib/sequel/connection_pool.rb:144:in `acquire'
        from /opt/local/lib/ruby/gems/1.8/gems/sequel-3.2.0/lib/sequel/connection_pool.rb:143:in `synchronize'
        from /opt/local/lib/ruby/gems/1.8/gems/sequel-3.2.0/lib/sequel/connection_pool.rb:143:in `acquire'
        from /opt/local/lib/ruby/gems/1.8/gems/sequel-3.2.0/lib/sequel/connection_pool.rb:105:in `hold'
        from /opt/local/lib/ruby/gems/1.8/gems/sequel-3.2.0/lib/sequel/database.rb:471:in `synchronize'
        from /opt/local/lib/ruby/gems/1.8/gems/sequel-3.2.0/lib/sequel/adapters/mysql.rb:128:in `execute'
        from /opt/local/lib/ruby/gems/1.8/gems/sequel-3.2.0/lib/sequel/dataset.rb:314:in `execute'
        from /opt/local/lib/ruby/gems/1.8/gems/sequel-3.2.0/lib/sequel/adapters/mysql.rb:342:in `execute'
        from /opt/local/lib/ruby/gems/1.8/gems/sequel-3.2.0/lib/sequel/adapters/mysql.rb:298:in `fetch_rows'
        from /opt/local/lib/ruby/gems/1.8/gems/sequel-3.2.0/lib/sequel/dataset.rb:185:in `each'
        from /opt/local/lib/ruby/gems/1.8/gems/sequel-3.2.0/lib/sequel/dataset/convenience.rb:156:in `map'
        from /opt/local/lib/ruby/gems/1.8/gems/sequel-3.2.0/lib/sequel/dataset/convenience.rb:156:in `map'
        from /opt/local/lib/ruby/gems/1.8/gems/sequel-3.2.0/lib/sequel/adapters/shared/mysql.rb:60:in `tables'
        from …
Run Code Online (Sandbox Code Playgroud)

ruby mysql sequel

8
推荐指数
1
解决办法
1万
查看次数

续集与ActiveRecord一起陷入困境?

我正在考虑将Sequel用于我的一些毛茸茸的SQL,我发现在Active Record中很难制作.

在同一个项目中使用Sequel和ActiveRecord时,有什么需要注意的吗?(除了在续集等中没有AR验证的明显的...)

ruby activerecord ruby-on-rails sequel

8
推荐指数
1
解决办法
3140
查看次数

为什么要使用SQL构建器?Arel v.Sequel v.T-SQL

我试图了解通过面向对象的构建器DSL构建SQL与参数化原始SQL字符串的好处.在研究/实现相同的查询三种方式之后,我注意到原始SQL是迄今为止最容易阅读的.这引出了一个问题,"为什么要跳过篮筐?" 为什么不直接声明和使用原始SQL?

这就是我的想法:

首先,我想它会使SQL更具可移植性,因为任何具有适配器的DB都可以使用它.我猜这是个大人物吧?但是,对于大多数数据库来说,大多数T-SQL都不是可理解的吗?

其次,它提供了一个可以重用的查询对象 - 作为其他查询,命名范围链接等的基础.

通过构建SQL而不是声明SQL,您实现的主要投资回报是什么?

def instances_of_sql(ttype_id) #raw sql
  ttype_id = get(ttype_id).try(:id)
  ti   = get('tmdm:type-instance')
  inst = get('tmdm:instance')
  type = get('tmdm:type')

  self.class.send :sanitize_sql, [%{
    SELECT t.*
    FROM associations a
    JOIN roles type    ON type.association_id = a.id AND type.ttype_id = ?
    JOIN roles inst    ON inst.association_id = a.id AND inst.ttype_id = ?
    JOIN topics t      ON t.id = inst.topic_id
    WHERE a.topic_map_id IN (?)
    AND a.ttype_id    = ?
    AND type.topic_id = ?
  }, type.id, inst.id, self.ids, ti.id, ttype_id]
end …
Run Code Online (Sandbox Code Playgroud)

ruby t-sql arel sequel

8
推荐指数
1
解决办法
1563
查看次数

续集 - 我可以在连接中对子查询进行别名吗?

使用Sequel我想将两个子查询连接在一起,共享一些列名,然后在select中对这些列进行表限定.

如果两个数据集只是表格,我理解如何做到这一点.例如,如果我有一个users表和一个items表,包含属于用户的项目,我想列出项目的名称及其所有者的名称:

@db[:items].join(:users, :id => :user_id).
  select{[items__name, users__name.as(user_name)]}
Run Code Online (Sandbox Code Playgroud)

产生

SELECT "items"."name", "users"."name" AS "user_name" 
  FROM "items" 
INNER JOIN "users" ON ("users"."id" = "items"."user_id")
Run Code Online (Sandbox Code Playgroud)

如预期的.

不过,我不确定如何做到这一点,如果我参加代表的子查询(叫他们两个任意的数据集my_itemsmy_users)

语法可能会采用这种形式

my_items.join(my_users, :id => :user_id).
  select{[ ... , ... ]}
Run Code Online (Sandbox Code Playgroud)

我将提供合格的列名来访问my_users.namemy_items.name.这样做的合适语法是什么?

的部分解决方案是使用t1__name的第一个参数,因为它似乎是提供给加入该数据集的别名有t1,t2等,但并不能帮助我晋级的项目名称,这是我需要提供的第二个参数.

我认为最理想的解决方案将使我能够为连接中的数据集提供别名,例如,如下所示(当然,由于多种原因,这不起作用)

my_items.as(alias1).join(my_users.as(alias2), :id => :user_id).
  select{[alias1__name, alias2__name ]}
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点?

谢谢!

更新

我认为from_self让我成为那里的一部分,例如

my_items.from_self(:alias => :alias1).join(my_users, :id => :user_id).
  select{[alias1__name, t1__name]}
Run Code Online (Sandbox Code Playgroud)

似乎做对了.

ruby sql join subquery sequel

7
推荐指数
1
解决办法
4486
查看次数

标签 统计

ruby ×10

sequel ×10

activerecord ×1

arel ×1

chaining ×1

join ×1

logging ×1

mysql ×1

postgresql ×1

ruby-on-rails ×1

sql ×1

subquery ×1

t-sql ×1