标签: sequel

如何断开与数据库的现有ruby续集连接?

我的意思是之前建立的那个

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"的公共实例方法,尽管它有"连接"一个.

也许有人已经遇到过这个问题.我很感激任何想法.

ruby sequel

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

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
查看次数

续集模型超过两个连接表

我有一个传统的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),我会收到" …

ruby orm model left-join sequel

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

使用Ruby Sequel返回原始sql的模型实例

有没有办法让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)

希望它有意义.

ruby sequel

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

在续集中写一个复杂的案例陈述?

我有一个相当复杂的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)

(来自Jeremy Evans的Github)

我最好的猜测是:

dataset.select( # rest of code omitted...
[[(:code => 'a'), 'x'],
[(:code …
Run Code Online (Sandbox Code Playgroud)

ruby mysql sql sequel

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

添加关联时续集访问many_to_many连接表

我正在使用Sequel建立一个心愿单系统.我有一个wishlistsitems表和一个items_wishlists连接表(这个名字是续集选择的).该items_wishlists表还有一个额外的列id for facebook id(所以我可以存储opengraph动作),这是一个NOT NULL列.

我也有WishlistItem续集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.

谢谢你的帮助

ruby sequel

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

如何使用“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
查看次数

Ruby - Sequel Model访问多个数据库

我正在尝试将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,是否只有一个多租户数据库是唯一的选择,尽管我更愿意避免这种情况,因为它限制可扩展性.

非常感谢解决方案或任何相关讨论.

谢谢皮特

ruby multiple-databases sequel

5
推荐指数
2
解决办法
3459
查看次数

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

我对 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
查看次数