需要帮助将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
我有一个带有日期列的表,其中日期以此格式存储 -
2012-08-01 16:39:17.601455+0530
Run Code Online (Sandbox Code Playgroud)
如何按"月份"在此列上"分组"或"group_and_count"?
我想定义一个像这样的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) 我有一个包含大量 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 查询的查询。
谢谢!
我有一个简单的 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 在幕后为我管理连接。我是否需要对其进行配置以确保它关闭连接?我该怎么做?
我有一个表应该存储id,名称和哈希.如何序列化哈希?(我使用Ruby和Sequel作为ORM.)
我正在使用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) 我有一个使用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)
如何捕获实际错误?我可以把"有一个错误"打印出来,但我想要更具体的东西 - 比如"名字是必需的","姓氏是必需的".
有人可以帮忙吗?
是否可以使用续集来执行这样的查询:
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)
我知道我可以使用续集一次执行这些查询,但我想同时执行它们.
我有一个方法,从我的表中选择所有行,如下所示:
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_hash用node_status它中的一个键初始化了哈希,但我不确定如何嵌套查询结果.