标签: sequel

在SQL和Sequel中需要帮助,包括内连接和where/filter

需要帮助将sql转移到续集:
SQL:

SELECT table_t.curr_id FROM table_t
INNER JOIN table_c ON table_c.curr_id = table_t.curr_id 
INNER JOIN table_b ON table_b.bic = table_t.bic
WHERE table_c.alpha_id = 'XXX' AND table_b.name='Foo';
Run Code Online (Sandbox Code Playgroud)

我陷入了续集,我不知道如何过滤,到目前为止这样:

 cid= table_t.select(:curr_id).
                    join(:table_c, :curr_id=>:curr_id).
                    join(:table_b, :bic=>:bic).
                    filter( ????? )  
Run Code Online (Sandbox Code Playgroud)

比以上更好的习语答案也很受欢迎.Tnx.

更新:
我必须修改一点才能使它工作

cid = DB[:table_t].select(:table_t__curr_id).
  join(:table_c, :curr_id=>:curr_id).
  join(:table_b, :bic=>:table_t__bic). #add table_t or else ERROR: column table_c.bic does not exist
  filter(:table_c__alpha_id => 'XXX',
         :table_b__name => 'Foo')
Run Code Online (Sandbox Code Playgroud)

没有过滤器,

cid = DB[:table_t].select(:table_t__curr_id).
                    join(:table_c, :curr_id=>:curr_id, :alpha_id=>'XXX').
                    join(:table_b, :bic=>:table_t__bic, :name=>'Foo')
Run Code Online (Sandbox Code Playgroud)

顺便说一句,我使用pgsql 9.0

ruby sql sequel

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

续集 - 按日期列按月分组

我有一个带有日期列的表,其中日期以此格式存储 -

2012-08-01 16:39:17.601455+0530
Run Code Online (Sandbox Code Playgroud)

如何按"月份"在此列上"分组"或"group_and_count"?

sqlite sequel

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

使用UNION和Sequel

我想定义一个像这样的SQL命令:

SELECT * FROM WOMAN
UNION
SELECT * FROM MEN
Run Code Online (Sandbox Code Playgroud)

我尝试使用Ruby + Sequel中的以下代码序列来定义它:

require 'sequel'

DB = Sequel::Database.new()
sel = DB[:women].union(DB[:men])
puts sel.sql
Run Code Online (Sandbox Code Playgroud)

结果是(我在结果上做了一些漂亮的打印):

SELECT * FROM (
    SELECT * FROM `women` 
    UNION 
    SELECT * FROM `men`
) AS 't1'
Run Code Online (Sandbox Code Playgroud)

还有一个(多余的?)SELECT.

如果我UNION在此代码示例中定义了多个

sel = DB[:women].union(DB[:men]).union(DB[:girls]).union(DB[:boys])
puts sel.sql
Run Code Online (Sandbox Code Playgroud)

我得到了更多多余的SELECT.

SELECT * FROM (
  SELECT * FROM (
    SELECT * FROM (
      SELECT * FROM `women` 
      UNION 
      SELECT * FROM `men`
    ) AS 't1' 
    UNION 
    SELECT * FROM …
Run Code Online (Sandbox Code Playgroud)

ruby sql union sequel

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

如何在 Sequel 中创建 SQL 函数?

我有一个包含大量 SQL 脚本的项目,我正在将该项目迁移到Sequel中。

在旧脚本中,我定义了大量 SQL 函数来构建查询。我应该如何创建这些函数以便我可以从 Sequel 访问它们?

例如我有一个 SQL 函数

CREATE FUNCTION my_func(...) RETURNS integer AS $$
  SELECT ...
$$ LANGUAGE SQL;
Run Code Online (Sandbox Code Playgroud)

我应该将上面的文本放在一个字符串中并调用以下内容吗?

DB.run("CREATE FUNCTION my_func(...) RETURNS integer AS $$ 
          SELECT ... 
        $$ LANGUAGE SQL;")
Run Code Online (Sandbox Code Playgroud)

看来可能还有更好的办法。

我可以使用 Sequel 将函数本身重写为 ruby​​ 函数,但我不相信这会实现我想要的,因为我想要运行在WHERE子句等中使用 SQL 查询的查询。

谢谢!

ruby sql function sequel

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

如何修复 Heroku 上的“sequel::DatabaseDisconnectError - Mysql::Error: MySQL 服务器已消失”

我有一个简单的 Sinatra 应用程序托管在 Heroku 上,并使用 Sequel 通过 ClearDB 插件连接到 MySql 数据库。

该应用程序工作正常,除非它闲置超过一分钟。在这种情况下,我发出的第一个请求给出了“500 内部服务器错误”,heroku logs显示为:

sequel::DatabaseDisconnectError - Mysql::Error: MySQL server has gone away
Run Code Online (Sandbox Code Playgroud)

如果我在出现此错误后刷新页面,则它工作正常,并且直到应用程序闲置一分钟左右,错误才会返回。

该应用程序正在运行两个 dyno,因此问题不是由您可能在免费帐户上看到的 Heroku dyno 空闲引起的。我联系了 ClearDB 支持,他们给了我以下建议:

如果您使用连接池,那么您应该将空闲超时设置为略低于 60 秒和/或设置保持活动状态,如下所述。如果您没有使用连接池,那么您必须确保应用程序在查询后实际关闭连接,并且不依赖网络超时来关闭它们。

我知道我可以创建一个 cron 作业来每 30 秒左右访问一次服务器,但这似乎是一个不雅的问题解决方案。关于确保应用程序关闭连接的另一个建议我不明白。我只是使用 Sequel 进行查询,我假设 Sequel 在幕后为我管理连接。我是否需要对其进行配置以确保它关闭连接?我该怎么做?

ruby heroku sinatra sequel cleardb

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

如何使用Sequel和Ruby序列化数据?

我有一个表应该存储id,名称和哈希.如何序列化哈希?(我使用Ruby和Sequel作为ORM.)

ruby sequel

3
推荐指数
2
解决办法
2580
查看次数

使用Ruby Sequel清理关联定义

我正在使用Jeremy Evan的续集来填充(SQLite)数据库,其中包含我从网页中搜集的数据.该数据库涉及我与协会表达的许多多对多关系.关联是在类定义中创建的,在运行脚本时始终会对其进行评估.重要的是,关联类定义需要具有必要的表.因此,表创建方法应该在关联定义的顶层.这是一个例子:

module Thing
db = Sequel.Sqlite('data.sqlite')

db.create_table(:clients)
    String :client_id, :primary_key => true
    String :client_data
end

db.create_table(:orders)
    String :order_id, :primary_key => true
    String :order_data
end

db.create_table(:orders_clients)
    String :order_id
    String :client_id
    primary_key [:order_id,:client_id]
end

class Person < Sequel::Model
    unrestrict_primary_key
    many_to_many :orders
end

class Order < Sequel::Model
    unrestrict_primary_key
    many_to_many :orders
end
end
Run Code Online (Sandbox Code Playgroud)

首先,我认为这是一个相当脏的解决方案,因为我的方法调用和类定义位于同一名称空间中.如果我尝试分离类定义,我会得到No database associated with Sequel::Model错误(这是有道理的,但我想推迟对关联定义的评估,在表调用之后,只要它们可能发生).

我希望能够在方法调用中创建表和关联.因此,我可以传递新数据库文件的名称:

def create_tables_and_schema (database_name)
    db = Sequel.Sqlite(database_name)
    db.create_table... #three of those, as above

class Person < Sequel::Model
    unrestrict_primary_key
    many_to_many …
Run Code Online (Sandbox Code Playgroud)

ruby coding-style sequel

3
推荐指数
1
解决办法
1181
查看次数

捕获续集::错误异常

我有一个使用Sequel和Postgres的Sinatra应用程序......这是一个非常简单的模块,可以插入到数据库中.我想从插入中捕获任何错误并返回有用的消息.

我的代码如下:

begin
   sql = DB["INSERT INTO table (id, firstname, lastname, ...) values (......)"]
   ds.insert
rescue Sequel::Error
   ...
end
Run Code Online (Sandbox Code Playgroud)

如何捕获实际错误?我可以把"有一个错误"打印出来,但我想要更具体的东西 - 比如"名字是必需的","姓氏是必需的".

有人可以帮忙吗?

ruby sinatra sequel

3
推荐指数
1
解决办法
1838
查看次数

使用续集gem的多个聚合查询

是否可以使用续集来执行这样的查询:

select (select count(*) from users where blah = 'blah') as "users",
       (select count(*) from contacts where blah = 'blah') as "contacts"
Run Code Online (Sandbox Code Playgroud)

我知道我可以使用续集一次执行这些查询,但我想同时执行它们.

ruby sequel sequel-gem

3
推荐指数
1
解决办法
1174
查看次数

嵌套Ruby哈希

我有一个方法,从我的表中选择所有行,如下所示:

smtp_status_raw = my_table.select(:message, :is_valid, :hostname).map { |h| h.values }
Run Code Online (Sandbox Code Playgroud)

这将返回一个如下所示的数组:

[{:message=>"blah", :is_valid=>true, :hostname=>"1"}, {:message=>"blah", :is_valid=>true, :hostname=>"2"}, {:message=>"blah", :is_valid=>true, :hostname=>"3}]
Run Code Online (Sandbox Code Playgroud)

使用上面的信息,我想创建一个如下所示的哈希:

{ 
:node_status => 
    {
        {:hostname => "1", :message: "blah"},
        {:hostname => "2", :message: "blah"},
        {:hostname => "3", :message: "blah"}
    }
}
Run Code Online (Sandbox Code Playgroud)

首先,我的问题 - 是否有可能像上面那样创建一个哈希?在上面的示例Sequel查询中,我有三个对象,它们是三个独立的主机,我想将这三个主机添加到一个:node_status密钥中.那可能吗?如果那不是有效的哈希,那么另一种选择是什么呢?

其次,这是我尝试过的:

# Initialize the hash
smtp_status_hash = { :node_status: => nil }
Run Code Online (Sandbox Code Playgroud)

smtp_status_hashnode_status它中的一个键初始化了哈希,但我不确定如何嵌套查询结果.

ruby hash sequel

3
推荐指数
1
解决办法
496
查看次数

标签 统计

sequel ×10

ruby ×9

sql ×3

sinatra ×2

cleardb ×1

coding-style ×1

function ×1

hash ×1

heroku ×1

sequel-gem ×1

sqlite ×1

union ×1