我的意思是之前建立的那个
DB = Sequel.sqlite('my_blog.db')
Run Code Online (Sandbox Code Playgroud)
要么
DB = Sequel.connect('postgres://user:password@localhost/my_db')
Run Code Online (Sandbox Code Playgroud)
要么
DB = Sequel.postgres('my_db', :user => 'user', :password => 'password', :host => 'localhost')
Run Code Online (Sandbox Code Playgroud)
或等等.
Sequel :: Database类没有名为"disconnect"的公共实例方法,尽管它有"连接"一个.
也许有人已经遇到过这个问题.我很感激任何想法.
Sequel 支持一种boolean类型。它将trueand存储false为SQLite 中的tand f。如果再次读取,数据将转换回true和false
SQLite 本身更喜欢存储true为 1 和false0(一些 SQLite 管理工具也期望如此)。如果我将布尔值也存储为“1”,Sequel 也会将该值转换为“true”:
require 'sequel'
DB = Sequel.sqlite()#'test.db')
DB.create_table(:test){
boolean :my_truth
nvarchar :descr, :size => 10
}
DB[:test].insert(1, '1')
p DB[:test].filter(:descr => '1').first #-> {:my_truth=>true, :descr=>"1"}
Run Code Online (Sandbox Code Playgroud)
但如果我选择 for true,则找不到任何值:
DB[:test].filter(:my_truth => true).each{|ds|
puts "\t%s" % ds[:descr]
}
Run Code Online (Sandbox Code Playgroud)
值true和"t"被发现:
DB[:test].insert(true, 'true')
DB[:test].insert('t', '"t"')
DB[:test].filter(:my_truth => true).each{|ds|
puts "\t%s" % ds[:descr] #true and …Run Code Online (Sandbox Code Playgroud) 我有一个传统的PostgreSQL数据库,它将一个模型分成两个表,它们之间有一对一的映射.
CREATE TABLE auth_user (
id SERIAL,
username VARCHAR(30),
email VARCHAR(75),
password VARCHAR(64),
first_name VARCHAR(75),
last_name VARCHAR(75)
)
CREATE TABLE user_profile (
user_id INTEGER REFERENCES auth_User.id,
phone VARCHAR(32)
)
Run Code Online (Sandbox Code Playgroud)
不幸的是,我无法更改数据库结构.
我想将它用作单个续集模型.从数据库中检索数据按预期工作:
class User < Sequel::Model
end
# Variant 1: using LEFT JOIN
#User.set_dataset DB[:auth_user].left_join(:user_profile, :user_id => :id)
# Variant 2: using two FROM tables
User.set_dataset DB[:auth_user, :user_profile]\
.where(:auth_user__id => :user_profile__user_id)
user = User[:username => "root"] # This works.
Run Code Online (Sandbox Code Playgroud)
但是,保存模型失败:
user.set :first_name => "John"
user.save # This fails.
Run Code Online (Sandbox Code Playgroud)
如果我使用数据集的第一个变体(with left_join),我会收到" …
有没有办法让Sequel返回模型而不是原始sql的哈希?
class Post < Sequel::Model
def self.recent
db["some sql goes here"].all #would like models returned here instead
end
end
Run Code Online (Sandbox Code Playgroud)
希望它有意义.
我有一个相当复杂的case语句适用于MySQL:
SELECT # rest of code omitted
CASE WHEN code = 'a' THEN 'x'
WHEN code IN ('m', 'n') THEN 'y'
WHEN class IN ('p', 'q') AND amount < 0 THEN 'z'
ELSE NULL END AS status
FROM # rest of code omitted
Run Code Online (Sandbox Code Playgroud)
然而,所有在续集中写这篇文章的尝试都失败了.我使用它作为模板:
Sequel.case([[:c, 1], [:d, 2]], 0) # (CASE WHEN "c" THEN 1 WHEN "d" THEN 2 ELSE 0 END)
Run Code Online (Sandbox Code Playgroud)
我最好的猜测是:
dataset.select( # rest of code omitted...
[[(:code => 'a'), 'x'],
[(:code …Run Code Online (Sandbox Code Playgroud) 我正在使用Sequel建立一个心愿单系统.我有一个wishlists和items表和一个items_wishlists连接表(这个名字是续集选择的).该items_wishlists表还有一个额外的列id for facebook id(所以我可以存储opengraph动作),这是一个NOT NULL列.
我也有Wishlist和Item续集many_to_many关联设置的模型.该Wishlist班也有:select在MANY_TO_MANY协会设置的选项select: [:items.*, :items_wishlists__facebook_action_id].
有没有一种方法可以在创建关联时添加额外的数据,比如wishlist.add_item my_item, facebook_action_id: 'xxxx'什么?我创建关联后无法执行此操作,因为facebook id在列上具有NOT NULL.
谢谢你的帮助
我正在尝试实现一个表单来搜索我的帖子标题。
这是控制器代码:
post '/search' do
@results = Post.all(:Title.like => "%#{params[:query]}%")
erb :layout
end
Run Code Online (Sandbox Code Playgroud)
这是layout.erb代码:
<form action="/search" method="post">
<input type="text" name="query"/><br />
<input type="submit" />
</form>
<% if @results %>
<table>
<%@results.each do |r|%>
<tr valign="top">
<td><%=r.Title%></td>
</tr>
<%end%>
</table>
<% end %>
Run Code Online (Sandbox Code Playgroud)
我收到一条错误消息,提示“未定义方法‘类似’:标题:符号”。
如何在 Sequel 迁移中创建 hstore 列?
Sequel.migration do
change do
add_column :logs, :geo, HStore
end
end
Run Code Online (Sandbox Code Playgroud)
失败。我必须加载扩展吗?
我正在尝试将Ruby Sequel::ModelORM功能用于Web服务,其中每个用户的数据都存储在一个单独的MySQL数据库中.可能有数千个用户,因此可能有数据库.
在每个Web请求中,我想构建连接字符串以连接到用户的数据,执行工作,然后关闭连接.
使用Sequel时,我可以指定用于特定代码块的数据库:
Sequel.connect(:adapter=>'mysql', :host=>'localhost', database=>'test1') do |db|
db.do_something()
end
Run Code Online (Sandbox Code Playgroud)
这一切都很好,我可以在特定用户的数据库上执行Sequel操作.但是,在使用时Sequel::Model,当我来做我的数据库操作时,它看起来像这样:
Supplier.create(:field1 => 'TEST')
Run Code Online (Sandbox Code Playgroud)
即它不db作为参数,所以只使用一些共享数据库配置.
我可以用两种方式配置数据库模型,设置全局DB变量:
DB = Sequel.connect(:adapter=>'mysql', :host=>'localhost', database=>'test1')
class Supplier < Sequel::Model
end
Run Code Online (Sandbox Code Playgroud)
或者,我可以为模型设置数据库:
Sequel::Model.db = Sequel.connect(:adapter=>'mysql', :host=>'localhost', database=>'test1')
class Supplier < Sequel::Model
end
Run Code Online (Sandbox Code Playgroud)
在任何一种情况下,设置这样的共享变量都是不对的 - 可能会同时处理多个请求,每个请求都需要自己的数据库配置.
有没有办法解决?有没有办法使用Sequel::Model?指定每个请求数据库配置?
顺便说一下,我遇到了与DataMapper类似的问题,我现在想知道如果使用Ruby,是否只有一个多租户数据库是唯一的选择,尽管我更愿意避免这种情况,因为它限制可扩展性.
非常感谢解决方案或任何相关讨论.
谢谢皮特
我对 Sequel 还很陌生,我正在挠头试图弄清楚如何让 Sequel 的 API 生成以下简单的 SQL:
select f.* from first f
join second s on f.second_id = s.id
where s.deactivated = false
Run Code Online (Sandbox Code Playgroud)
我能想到的最好的方法是:
First.join(:second, deactivated: false, id: :second_id)
.paged_each do |first|
# magic happens here
end
Run Code Online (Sandbox Code Playgroud)
但这并select *没有select first.*,因此id对分页和抛出的顺序感到困惑PG::AmbiguousColumn: ERROR: ORDER BY "id" is ambiguous
这是使用 Sequel 5.9.0 和 Postres 10。
感谢@engineersmnky 的建议qualify和一些进一步阅读这里是我最终使用的方法。
First.join(:second, id: :second_id, deactivated: false)
.qualify
.stream.each do |first|
# magic happens here
end
Run Code Online (Sandbox Code Playgroud)
该 …