我通过Ruby gem'seququel'使用PostgreSQL.
我想要舍入到小数点后两位.
这是我的代码:
SELECT ROUND(AVG(some_column),2)
FROM table
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
PG::Error: ERROR: function round(double precision, integer) does
not exist (Sequel::DatabaseError)
Run Code Online (Sandbox Code Playgroud)
运行以下代码时,我没有收到任何错误:
SELECT ROUND(AVG(some_column))
FROM table
Run Code Online (Sandbox Code Playgroud)
有谁知道我做错了什么?
Encoding::UndefinedConversionError - "\xC2" from ASCII-8BIT to UTF-8每次我尝试将哈希转换为JSON字符串时,我都会继续获取.我试着用[.encode | .force_encoding](["UTF-8" | "ASCII-8BIT" ]),链.encode带.force_encoding,向后切换参数,但似乎没有任何工作,所以我抓住了错误是这样的:
begin
menu.to_json
rescue Encoding::UndefinedConversionError
puts $!.error_char.dump
p $!.error_char.encoding
end
Run Code Online (Sandbox Code Playgroud)
菜单是续集的dataset.to_hash,内容来自MySQL DB,utf8_general_ci编码并返回:
"\ XC2"
<#Encoding:ASCII-8BIT>
无论我.encode/ .force_encoding我使用什么,编码都不会改变.我甚至试图在.gsub!(/\\\xC2/)没有运气的情况下更换琴弦.
有任何想法吗?
我的一位同事目前正在设计类似下面的SQL查询来生成报告,这些报告通过外部数据查询显示在excel文件中.目前,只需要DB上的报告流程(无CRUD操作).
我试图说服他最好使用ruby ORM以便能够在rails/sinatra应用程序中显示数据.
尽管在显示数据方面有明显的优势,但他在学习使用像Sequel或Datamapper这样的ORM方面有什么优势呢?
他正在编写的SQL查询显然非常复杂,并且对于SQL来说相对较新,他经常抱怨它非常耗时且令人困惑.是否可以使用ORM编写极其复杂的查询?如果是这样,哪个是最合适的(我听说续集对遗留dbs有好处)?在制作复杂的数据库查询时,学习ruby和使用ORM与坚持使用纯SQL有什么好处?
我正在寻找一个Ruby ORM来取代ActiveRecord.我一直在看Sequel和DataMapper.它们看起来很不错,但是它们似乎都不是基本的:当你不需要时,不要将所有内容都加载到内存中.
我的意思是我在ActiveRecord和Sequel上尝试了以下(或等效的)有很多行的表:
posts.each { |p| puts p }
Run Code Online (Sandbox Code Playgroud)
他们两个都记忆犹新.它们似乎将所有内容加载到内存中,而不是在需要时获取内容.我find_in_batches在ActiveRecord中使用了它,但这不是一个可接受的解决方案:
为什么我的代码应该知道分页机制?我很高兴配置页面大小的某个地方,但就是这样.有了find_in_batches你需要做的是这样的:
post.find_in_batches {| batch | batch.each {| p | 把p}}
但这应该是透明的.
那么有可靠的Ruby ORM可以正确获取吗?
更新:
正如塞尔吉奥所说,在Rails 3中你可以使用find_each我想要的东西.但是,由于ActiveRecord不是一个选项,除非有人能说服我使用它,所以问题是:
find_each,而find应该这样做,不应该吗?说我有一个续集表达式,如:
db.select(:id).from(:some_table).where(:foo => 5)
Run Code Online (Sandbox Code Playgroud)
有没有办法获得这将生成的SQL字符串(即"SELECT id FROM some_table WHERE foo = 5")?我注意到调用inspect或to_s上面的表达式的结果包括生成的SQL,但不知道如何直接访问它.
那些不返回数据集的Sequel表达式如何:
db.from(:some_table).update(:foo => 5)
Run Code Online (Sandbox Code Playgroud)
是否可以在执行之前从中查看SQL?
我还不清楚使用Sequel运行原始SQL查询的正确方法.
目前我正在尝试这个:
DB.fetch("SELECT * FROM zone WHERE dialcode = '#{@dialcode}' LIMIT 1") do |row|
@zonename = row
end
Run Code Online (Sandbox Code Playgroud)
如何以原始SQL运行查询然后像正常一样访问结果?
if @zonename.name = "UK"
Run Code Online (Sandbox Code Playgroud) 给定Hash,基于要使用的键列表创建子集Hash的最有效方法是什么?
h1 = { a:1, b:2, c:3 } # Given a hash...
p foo( h1, :a, :c, :d ) # ...create a method that...
#=> { :a=>1, :c=>3, :d=>nil } # ...returns specified keys...
#=> { :a=>1, :c=>3 } # ...or perhaps only keys that exist
Run Code Online (Sandbox Code Playgroud)
在续集数据库工具包允许一个通过传递一个Hash创建或更新模型实例:
foo = Product.create( hash_of_column_values )
foo.update( another_hash )
Run Code Online (Sandbox Code Playgroud)
该西纳特拉 Web框架使可用命名一个哈希params包括表单变量,查询字符串参数也路由匹配.
如果我创建一个只包含与数据库列相同的字段的表单并将其发布到此路由,则一切都非常方便:
post "/create_product" do
new_product = Product.create params
redirect "/product/#{new_product.id}"
end
Run Code Online (Sandbox Code Playgroud)
然而,这既脆弱又危险.这是危险的,因为恶意黑客可以发布一个表格,其中的列不打算更改并更新.它很脆弱,因为在这条路线上使用相同的形式是行不通的:
post "/update_product/:foo" do |prod_id| …Run Code Online (Sandbox Code Playgroud) 我有一个DB,其中有一个shows带有多语言列的表title.我想通过添加如下索引来优化全文搜索:
CREATE INDEX title_idx ON shows USING gin(to_tsvector(title));
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
ERROR: functions in index expression must be marked IMMUTABLE
Run Code Online (Sandbox Code Playgroud)
它基本上要求我添加语言参数以使to_tsvector不可变.结果将是:
CREATE INDEX title_idx ON shows USING gin(to_tsvector(LANGUAGE, title));
Run Code Online (Sandbox Code Playgroud)
哪里LANGUAGE是我的目标语言之一.
是否可以创建适用于多种语言的索引?
我正在尝试连接到这个mysql数据库.DataMapper以UTF-8很好地获取所有内容,但Sequel总是返回ASCII-8bit中的字符串,这会产生.to_json错误.
为了让它发挥作用,我尝试了几件事.
Encoding.default_external = Encoding::UTF_8
Encoding.default_internal = Encoding::UTF_8
DB.run 'set names utf8'
Sequel.mysql 'db', (...), :encoding => 'utf-8'
Run Code Online (Sandbox Code Playgroud)
我有宝石:mysql(2.9.0)(试过没有),mysql2(0.3.11)和续集(3.42.0)
唯一有效的方法是手动强制对每个字符串进行编码,这个字符串不是理想的.
我刚开始在一个非常小的Sinatra应用程序中使用Sequel.由于我只有一个数据库表,所以我不需要使用模型.
我想更新记录(如果存在)或插入新记录(如果不存在).我提出了以下解决方案:
rec = $nums.where(:number => n, :type => t)
if $nums.select(1).where(rec.exists)
rec.update(:counter => :counter + 1)
else
$nums.insert(:number => n, :counter => 1, :type => t)
end
Run Code Online (Sandbox Code Playgroud)
哪里$nums是DB[:numbers]数据集.
我相信这种方式不是"更新或插入"行为的最优雅实现.
应该怎么做?