标签: sequel

SQLite 和 Sequel 的布尔值

Sequel 支持一种boolean类型。它将trueand存储false为SQLite 中的tand f。如果再次读取,数据将转换回truefalse

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)

ruby sqlite boolean sequel

5
推荐指数
1
解决办法
2199
查看次数

如何使用“like”进行续集查询?

我正在尝试实现一个表单来搜索我的帖子标题。

这是控制器代码:

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)

我收到一条错误消息,提示“未定义方法‘类似’:标题:符号”。

ruby sinatra sequel

5
推荐指数
1
解决办法
3004
查看次数

如何在 Sequel 迁移中创建 hstore 列?

如何在 Sequel 迁移中创建 hstore 列?

Sequel.migration do
  change do
    add_column :logs, :geo, HStore
  end
end
Run Code Online (Sandbox Code Playgroud)

失败。我必须加载扩展吗?

ruby migration postgresql sequel hstore

5
推荐指数
1
解决办法
2226
查看次数

在另一个表上使用连接和条件进行后续查询

我对 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 sequel

5
推荐指数
1
解决办法
1881
查看次数

Mysql/Ruby Sequel最后插入ID值,有什么方法?

我只想使用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 ID
Run 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)

ruby mysql sequel

4
推荐指数
2
解决办法
3392
查看次数

Rails 3与Sequel集成?

似乎在github上至少有四个repos声称可以在最新的Rails 3测试版中加入续集.

在Rails 3项目中有没有人成功用Sequel取代ActiveRecord?你能提供一些关于如何最好地解决它的提示吗?

我有兴趣在Rails 3上开始一个新的项目,并试图在右脚下车:理想的续集,minitest和omniauth(如果它不会痛苦的设计).我知道这不是幸运的堆栈,但这些宝石吸引我的蜘蛛感.我正在寻找任何可以帮助我解决任何宝石问题和冲突的建议.

ruby minitest omniauth ruby-on-rails-3 sequel

4
推荐指数
1
解决办法
2244
查看次数

如何使用Sequel ORM以随机顺序从SQLite获取记录?

试图转换此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 sqlite sequel

4
推荐指数
1
解决办法
1297
查看次数

sidekiq app中的postgres编码错误

我正在开发一个应用程序,其中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的数据格式正确?

ruby postgresql encoding sequel

4
推荐指数
1
解决办法
1500
查看次数

Sequel :: AdapterNotFound:LoadError:无法加载这样的文件 - win32ole

我成功地能够连接到数据库MySQLPostgres使用数据库'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提供适配器.

谢谢...

ruby database ruby-on-rails ruby-on-rails-3 sequel

4
推荐指数
1
解决办法
7627
查看次数

续集(Ruby),如何以安全的方式增加和使用DB计数器?

我找到了4种"正确"的方法:

  1. ActiveRecord的备忘单中,用户替换ActiveRecord increment,increment_counter并且应该是album.values[:column] -= 1 # or += 1 for incrementalbum.update(:counter_name=>Sequel.+(:counter_name, 1))
  2. SO解决方案 update_sql中建议具有相同的效果s[:query_volume].update_sql(:queries => Sequel.expr(3) + :queries)
  3. 在一个随机的线程中我找到了这个dataset.update_sql(:exp => 'exp + 10'.lit)
  4. 用于更新的Sequels API文档中,我找到了这个解决方案http://sequel.jeremyevans.net/rdoc/classes/Sequel/Dataset.html#method-i-update

然而,没有一个解决方案实际更新值并以安全,原子的方式返回结果.

基于"添加值然后保存"的解决方案应该在多处理环境中以不确定的方式失败,从而导致错误,例如:

  1. 专辑的计数器是0
  2. 线程A和线程B都获取 album
  3. 线程A和线程B都增加散列/模型/ etc中的值
  4. 线程A和线程B都将计数器更新为相同的值
  5. 结果:A和B都将计数器设置为1并使用计数器值1

Sequel.exprSequel.+在另一方面实际上并不返回一个值,而是一个Sequel::SQL::NumericExpression和(据我所知)你没有得到它的短做一套DB往返的方式,这意味着这可能发生:

  1. 专辑的计数器是0
  2. 线程A和B都增加值,值增加2
  3. 线程A和B都从DB中获取行
  4. 结果:A和B都将计数器设置为2并使用计数器值2

因此,如果没有编写自定义锁定代码,那么解决方案是什么?如果没有,没有编写自定义锁定代码:)最好的方法是什么?

更新1

我一般不满意答案说我想要太多的生活,因为1回答建议:)

专辑只是文档中的一个例子.

想象一下,例如你在电子商务POS上有一个交易柜台,它可以在不同的主机上同时接受2个交易,并且你需要在24小时内用一个整数计数器发送它们(称为systan),发送2具有相同systan和1的trx将被拒绝,或者更糟糕的是,计数中的间隙被警告(因为它们暗示"缺少事务"),因此不可能使用DB的ID值.

一个不太严重的例子,但与我的用例更相关,几个文件导出在后台worker中同时触发,每个文件目的地都有自己的计数器.计数器中的间隙被警告,工作人员在不同的主机上(因此互斥体没有用).我有一种感觉,我很快就会解决更严重的问题.

数据库序列也不好,因为它意味着在添加每个终端时都要做DDL,我们在这里谈论1000.即使在我不那么严重的用例中,门户网站上的DDLing操作仍然是PITA,甚至可能不起作用,具体取决于下面的缓存方案(由于实现ActiveRecordSequel- 并且在我的情况下我使用两者 - 可能需要服务器重启才能注册一个商人).

Redis可以做到这一点,但是当你坐在符合ACID标准的数据库上时,为计数器添加另一个基础架构组件似乎很疯狂.

ruby atomic sequel

4
推荐指数
1
解决办法
739
查看次数