1

Sequel 中有一个简单的数据库:

DB = Sequel.sqlite

DB.create_table :items do
    primary_key :id
    DateTime :date
    String :name
end

items = DB[:items]
items.insert(:name => 'abc', :date => DateTime.now)
items.insert(:name => 'ghi', :date => DateTime.now)
items.insert(:name => 'def', :date => DateTime.now)

问题:在数据库中存储“奇怪”对象是否是个好主意,比如 DateTime?

puts items.first(:name => 'ghi')[:date].year

输出 '2010' 所以,很好 - 它有效。但我仍然对此很好奇。如果没什么不好,那过滤呢?像这样的东西:

puts items.first(:date.year => 2010)[:name]

……行不通。是否有可能以其他方式做到这一点?如何?

4

2 回答 2

2

bjg 是正确的。对于您的具体情况,而不是:

puts items.first(:date.year => 2010)[:name]

你可以试试:

puts items.first(:date.extract(:year) => 2010)[:name]

如果您的数据库支持 SQL 标准提取功能(并非所有数据库都支持),这应该可以工作。如果您的数据库没有,您将不得不调用您的数据库中存在的任何类似函数。

于 2010-07-19T16:13:51.033 回答
1

我想你在这里问了两个不同的问题:

  1. 在关系数据库中存储丰富的对象(如日期)是绝对正常的(如果不是全部支持日期等)。Sequel 的DateTime属性类型承认这一事实,并提供了对其所有支持的后端的抽象。

  2. 过滤不太明显。不同的后端(读取数据库实现)将提供非常不同的分解方式,从而选择这些对象的一部分。像 Sequel 这样的 ORM 必须绘制一些抽象线,这些抽象线(希望)普遍适用于所有支持的后端。在某些情况下(DateTime很可能是其中之一),更复杂的过滤将无法通过 ORM 的语法糖获得。在这种情况下,您可能需要使用每个数据库的 SQL 工具来实现您想要的,或者至少在形成语法糖解决方案时要注意底层语义

于 2010-07-13T00:35:57.713 回答