【问题标题】:How to handle deprecated "Built in translators" in SQLite3如何处理 SQLite3 中已弃用的“内置翻译器”
【发布时间】:2020-06-23 20:45:05
【问题描述】:

似乎不推荐使用 SQLite3 gem 的类型转换。例如这段代码:

#!/usr/bin/ruby -w
require 'sqlite3'
dbh = SQLite3::Database.new('/tmp/my.db')
dbh.translator

产生这些大量错误:

/var/lib/gems/2.5.0/gems/sqlite3-1.4.2/lib/sqlite3/translator.rb:75:in `block in register_default_translators' is calling `add_translator`.
Built in translators are deprecated and will be removed in version 2.0.0
/var/lib/gems/2.5.0/gems/sqlite3-1.4.2/lib/sqlite3/translator.rb:75:in `block in register_default_translators' is calling `add_translator`.
Built in translators are deprecated and will be removed in version 2.0.0
/var/lib/gems/2.5.0/gems/sqlite3-1.4.2/lib/sqlite3/translator.rb:77:in `register_default_translators' is calling `add_translator`.
Built in translators are deprecated and will be removed in version 2.0.0
/var/lib/gems/2.5.0/gems/sqlite3-1.4.2/lib/sqlite3/translator.rb:78:in `register_default_translators' is calling `add_translator`.
Built in translators are deprecated and will be removed in version 2.0.0
/var/lib/gems/2.5.0/gems/sqlite3-1.4.2/lib/sqlite3/translator.rb:86:in `block in register_default_translators' is calling `add_translator`.
Built in translators are deprecated and will be removed in version 2.0.0
/var/lib/gems/2.5.0/gems/sqlite3-1.4.2/lib/sqlite3/translator.rb:86:in `block in register_default_translators' is calling `add_translator`.
Built in translators are deprecated and will be removed in version 2.0.0
/var/lib/gems/2.5.0/gems/sqlite3-1.4.2/lib/sqlite3/translator.rb:86:in `block in register_default_translators' is calling `add_translator`.
Built in translators are deprecated and will be removed in version 2.0.0
/var/lib/gems/2.5.0/gems/sqlite3-1.4.2/lib/sqlite3/translator.rb:86:in `block in register_default_translators' is calling `add_translator`.
Built in translators are deprecated and will be removed in version 2.0.0
/var/lib/gems/2.5.0/gems/sqlite3-1.4.2/lib/sqlite3/translator.rb:86:in `block in register_default_translators' is calling `add_translator`.
Built in translators are deprecated and will be removed in version 2.0.0
/var/lib/gems/2.5.0/gems/sqlite3-1.4.2/lib/sqlite3/translator.rb:86:in `block in register_default_translators' is calling `add_translator`.
Built in translators are deprecated and will be removed in version 2.0.0
/var/lib/gems/2.5.0/gems/sqlite3-1.4.2/lib/sqlite3/translator.rb:86:in `block in register_default_translators' is calling `add_translator`.
Built in translators are deprecated and will be removed in version 2.0.0
/var/lib/gems/2.5.0/gems/sqlite3-1.4.2/lib/sqlite3/translator.rb:92:in `block in register_default_translators' is calling `add_translator`.
Built in translators are deprecated and will be removed in version 2.0.0
/var/lib/gems/2.5.0/gems/sqlite3-1.4.2/lib/sqlite3/translator.rb:92:in `block in register_default_translators' is calling `add_translator`.
Built in translators are deprecated and will be removed in version 2.0.0
/var/lib/gems/2.5.0/gems/sqlite3-1.4.2/lib/sqlite3/translator.rb:92:in `block in register_default_translators' is calling `add_translator`.
Built in translators are deprecated and will be removed in version 2.0.0
/var/lib/gems/2.5.0/gems/sqlite3-1.4.2/lib/sqlite3/translator.rb:92:in `block in register_default_translators' is calling `add_translator`.
Built in translators are deprecated and will be removed in version 2.0.0
/var/lib/gems/2.5.0/gems/sqlite3-1.4.2/lib/sqlite3/translator.rb:92:in `block in register_default_translators' is calling `add_translator`.
Built in translators are deprecated and will be removed in version 2.0.0
/var/lib/gems/2.5.0/gems/sqlite3-1.4.2/lib/sqlite3/translator.rb:97:in `block in register_default_translators' is calling `add_translator`.
Built in translators are deprecated and will be removed in version 2.0.0
/var/lib/gems/2.5.0/gems/sqlite3-1.4.2/lib/sqlite3/translator.rb:97:in `block in register_default_translators' is calling `add_translator`.
Built in translators are deprecated and will be removed in version 2.0.0
/var/lib/gems/2.5.0/gems/sqlite3-1.4.2/lib/sqlite3/translator.rb:97:in `block in register_default_translators' is calling `add_translator`.
Built in translators are deprecated and will be removed in version 2.0.0
/var/lib/gems/2.5.0/gems/sqlite3-1.4.2/lib/sqlite3/translator.rb:106:in `register_default_translators' is calling `add_translator`.
Built in translators are deprecated and will be removed in version 2.0.0

类型转换器有替代品吗?就类型翻译而言,我只是靠我自己吗?

特别是,我想将 Ruby 中的 truefalse 翻译成 SQLite 中的 1 和 0。

【问题讨论】:

标签: ruby sqlite


【解决方案1】:

我认为这实际上是一系列良性的调试警告。

ruby -w 在 SQLite3 中设置一个标志,发出更详细的输出。

#!/usr/bin/ruby -w
require 'sqlite3'
dbh = SQLite3::Database.new('/tmp/my.db')
dbh.translator

# !> /Users/greg/.rbenv/versions/2.7.0/lib/ruby/gems/2.7.0/gems/seeing_is_believing-3.6.1/lib/seeing_is_believing/the_matrix.rb:51: warning: `*' interpreted as argument prefix
# !> /Users/greg/.rbenv/versions/2.7.0/lib/ruby/gems/2.7.0/gems/seeing_is_believing-3.6.1/lib/seeing_is_believing/safe.rb:59: warning: constant ::Fixnum is deprecated
# !> /Users/greg/.rbenv/versions/2.7.0/lib/ruby/gems/2.7.0/gems/seeing_is_believing-3.6.1/lib/seeing_is_believing/the_matrix.rb:54: warning: method redefined; discarding old exec
# !> /Users/greg/.rbenv/versions/2.7.0/lib/ruby/gems/2.7.0/gems/seeing_is_believing-3.6.1/lib/seeing_is_believing/the_matrix.rb:60: warning: method redefined; discarding old exit!
# !> /Users/greg/.rbenv/versions/2.7.0/lib/ruby/gems/2.7.0/gems/seeing_is_believing-3.6.1/lib/seeing_is_believing/the_matrix.rb:65: warning: method redefined; discarding old fork
# !> /Users/greg/.rbenv/versions/2.7.0/lib/ruby/gems/2.7.0/gems/seeing_is_believing-3.6.1/lib/seeing_is_believing/the_matrix.rb:68: warning: method redefined; discarding old fork
# !> /Users/greg/.rbenv/versions/2.7.0/lib/ruby/gems/2.7.0/gems/seeing_is_believing-3.6.1/lib/seeing_is_believing/the_matrix.rb:69: warning: method redefined; discarding old fork
# !> /Users/greg/.rbenv/versions/2.7.0/lib/ruby/gems/2.7.0/gems/seeing_is_believing-3.6.1/lib/seeing_is_believing/customize_pp.rb:2: warning: method redefined; discarding old pretty_print
# !> /Users/greg/.rbenv/versions/2.7.0/lib/ruby/2.7.0/pp.rb:396: warning: previous definition of pretty_print was here
....

删除-w并尝试:

#!/usr/bin/ruby 
require 'sqlite3'
dbh = SQLite3::Database.new('/tmp/my.db')
dbh.translator

所有警告都消失了。

就分别从true/false 转换为1/0 而言,简单的散列可以很容易:

TRANSLATOR = {
  true => 1,
  false => 0
}

TRANSLATOR[true]  # => 1
TRANSLATOR[false] # => 0

我建议不要直接使用 SQLite3 gem。 ORM 层将使编写与 DBM 无关的代码变得非常容易,从而可以轻松地从 SQLite 迁移到 PostgreSQL、MySQL、Oracle 等,而无需重写任何内容,除了 DBM 类型的数据和使用 YAML文件来存储 DSN 信息,将其读入,然后填充连接的变量,这使得它变得更加容易。调整 YAML 文件,重新启动代码,然后您就可以开始运行了。

我个人喜欢并推荐Sequel,但如果你有 Rails 经验,那么 Active Record 也是一个合理的选择。

【讨论】:

  • 我一直保持警告。警告是有原因的,在这种情况下是为了警告我们某个功能将消失。事实上,如果我按照自己的方式行事,警告将是默认设置,您必须采取主动措施将其关闭。好的,不要听起来很尖刻。你提出了一个完全合理的短期解决方案,我相信短期解决方案在世界上占有一席之地。但在这种情况下,我需要一些长期的东西。谢谢你的建议。
  • 警告很好,除非它们被用于反复触发详细诊断。应该有一种方法可以告诉 SQLite 你想要的警告级别。我理解您多年来编写和支持大型后端系统的观点,但是取出机器的失控日志可能会令人恼火,尤其是在深夜。我的开发系统设置了详细级别,但我们的测试将它们设置为不那么详细的设置,并且生产使用了严重错误。当代码投入生产时,我希望我们已经找到了我们输入的错误。
  • 我感受到了你的痛苦。在我弄清楚为什么我一直用完磁盘空间之前,我已经收到警告关闭了整个服务器。
猜你喜欢
  • 1970-01-01
  • 2022-11-20
  • 2012-03-14
  • 1970-01-01
  • 2020-04-01
  • 2012-02-08
  • 1970-01-01
  • 2013-09-04
  • 1970-01-01
相关资源
最近更新 更多