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) 我正在尝试实现一个表单来搜索我的帖子标题。
这是控制器代码:
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)
失败。我必须加载扩展吗?
我对 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)
该 …
我只想使用Ruby的续集获取last_insert_id():
insertret = @con.run("INSERT INTO `wv_persons` ( `id` ) VALUES ( NULL )")
pp insertret.inspect # returns "nil", expected that..
last_insert_id = @con.run("SELECT LAST_INSERT_ID() AS last_id;")
pp last_insert_id.inspect # returns "nil", should be an IDRun Code Online (Sandbox Code Playgroud)
SELECT查询应返回last_id,但.run不返回它.我应该用什么方法代替?
解决方案:(感谢Josh Lindsey)
last_insert_id = @con[:wv_persons].insert({})
last_insert_id = last_insert_id.to_s
puts "New person ["+ last_insert_id +"]"Run Code Online (Sandbox Code Playgroud) 试图转换此SQLite查询
SELECT * FROM `terms` ORDER BY RANDOM() LIMIT 10
Run Code Online (Sandbox Code Playgroud)
使用Sequel模型.我得到的最接近的:
Term.order(rand{}).limit(10)
Term.order('random ()').limit(10)
Run Code Online (Sandbox Code Playgroud)
转化为
<Sequel::SQLite::Dataset: "SELECT * FROM `terms` ORDER BY 0.6160215951854449 LIMIT 10">
<Sequel::SQLite::Dataset: "SELECT * FROM `terms` ORDER BY 'random ()' LIMIT 10">
Run Code Online (Sandbox Code Playgroud)
但都不起作用.有没有办法将SQLite或其他特定于数据库的函数传递给Sequel order()?
我正在开发一个应用程序,其中ruby sidekiq进程调用第三方并将数据解析到数据库中.
我正在使用续集和我的朋友.
我在结果中得到了一些奇怪的字符,例如:
"Tweets en Ingl\xE9s y en Espa\xF1ol"
当尝试保存到postgres时,会发生以下错误:
Sequel :: DatabaseError:PG :: CharacterNotInRepertoire:ERROR:编码"UTF8"的无效字节序列:0xe9 0x73 0x20
奇怪的是,字符串认为它是UTF-8,如果我检查编码名称,它说:
name.encoding.name #UTF-8
Run Code Online (Sandbox Code Playgroud)
我该怎么做才能确保postgres的数据格式正确?
我成功地能够连接到数据库MySQL和Postgres使用数据库'sequel'.
我想从Ubuntu 12.04连接到SQL Server数据库到Windows机器.使用tiny-tds我们可以做到这一点,但我想用'续集'进行连接
宝石安装
gem 'dbi'
gem 'tiny_tds'
gem 'sequel'
gem "win32ole-pp"
gem "rubysl-win32ole"
gem 'activerecord-sqlserver-adapter'
Run Code Online (Sandbox Code Playgroud)
我收到了以下错误.
1.9.3p448 :007 > require 'win32ole-pp'
LoadError: cannot load such file -- win32ole-pp
1.9.3p448 :008 > require 'rubysl-win32ole'
=> false
1.9.3p448 :001 > DB = Sequel.ado(:database => 'test_database', :host => 'xxx.xxx.xxx.xxx', :user => 'username', :password => 'password', :provider => 'SQLNCLI10')
Sequel::AdapterNotFound: LoadError: cannot load such file -- win32ole
Run Code Online (Sandbox Code Playgroud)
Sequel为微小的tds提供适配器.我该如何使用该适配器?请告诉我如何用续集宝石做到这一点?
我没有得到如何使用续集的小tds,因为续集为tiny_tds提供适配器.
谢谢...
我找到了4种"正确"的方法:
increment,increment_counter并且应该是album.values[:column] -= 1 # or += 1 for increment和album.update(:counter_name=>Sequel.+(:counter_name, 1))update_sql中建议具有相同的效果s[:query_volume].update_sql(:queries => Sequel.expr(3) + :queries)dataset.update_sql(:exp => 'exp + 10'.lit)http://sequel.jeremyevans.net/rdoc/classes/Sequel/Dataset.html#method-i-update然而,没有一个解决方案实际更新值并以安全,原子的方式返回结果.
基于"添加值然后保存"的解决方案应该在多处理环境中以不确定的方式失败,从而导致错误,例如:
albumSequel.expr而Sequel.+在另一方面实际上并不返回一个值,而是一个Sequel::SQL::NumericExpression和(据我所知)你没有得到它的短做一套DB往返的方式,这意味着这可能发生:
因此,如果没有编写自定义锁定代码,那么解决方案是什么?如果没有,没有编写自定义锁定代码:)最好的方法是什么?
我一般不满意答案说我想要太多的生活,因为1回答建议:)
专辑只是文档中的一个例子.
想象一下,例如你在电子商务POS上有一个交易柜台,它可以在不同的主机上同时接受2个交易,并且你需要在24小时内用一个整数计数器发送它们(称为systan),发送2具有相同systan和1的trx将被拒绝,或者更糟糕的是,计数中的间隙被警告(因为它们暗示"缺少事务"),因此不可能使用DB的ID值.
一个不太严重的例子,但与我的用例更相关,几个文件导出在后台worker中同时触发,每个文件目的地都有自己的计数器.计数器中的间隙被警告,工作人员在不同的主机上(因此互斥体没有用).我有一种感觉,我很快就会解决更严重的问题.
数据库序列也不好,因为它意味着在添加每个终端时都要做DDL,我们在这里谈论1000.即使在我不那么严重的用例中,门户网站上的DDLing操作仍然是PITA,甚至可能不起作用,具体取决于下面的缓存方案(由于实现ActiveRecord和Sequel- 并且在我的情况下我使用两者 - 可能需要服务器重启才能注册一个商人).
Redis可以做到这一点,但是当你坐在符合ACID标准的数据库上时,为计数器添加另一个基础架构组件似乎很疯狂.