我想做点什么
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的域外?
这是我加入两个表的代码:
DB.from(:sources).join(:payloads, :source_id => :id)
Run Code Online (Sandbox Code Playgroud)
表名是:sources,:payloads.
问题是:id有效负载中有一列覆盖了:id列:sources.我需要使用别名,以便我只获取包含所有列名称的超级表.但是,正如当前编写的那样,并且我的表当前是结构化的,:id列正在合并,第二个表优先.这有意义吗?
如何创建别名以使:id列:sources仍然显示?
在我的(非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行为是在INFO级别记录所有数据库查询(与在DEBUG级别记录的ActiveRecord不同).我该如何改变?
在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)
是否有更好的解决方案来链接或条件?
我已经阅读了所有续集的文档,但我找不到创建数据库的方法,假设我能做到这一点.
我正在运行一个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) 当我尝试从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) 我正在考虑将Sequel用于我的一些毛茸茸的SQL,我发现在Active Record中很难制作.
在同一个项目中使用Sequel和ActiveRecord时,有什么需要注意的吗?(除了在续集等中没有AR验证的明显的...)
我试图了解通过面向对象的构建器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) 使用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_items和my_users)
语法可能会采用这种形式
my_items.join(my_users, :id => :user_id).
select{[ ... , ... ]}
Run Code Online (Sandbox Code Playgroud)
我将提供合格的列名来访问my_users.name和my_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)
似乎做对了.