【发布时间】:2015-11-29 10:46:33
【问题描述】:
我有一个包含人名和生日的数据库。生日格式为mm/dd/yyyy,如“3/13/1960”。
我想提取在特定日期之后出生的人的列表。我称这个日期为“基准”。
您在下面看到的程序首先创建了一个人员数据库(以模拟我想要使用的真实数据库),然后提取所需的列表。问题是结果不符合我的预期:
import datetime as dt
import peewee as pw
db = pw.SqliteDatabase('people1.db')
class Person(pw.Model):
name = pw.CharField()
birthday = pw.DateField(formats=['%m/%d/%Y'])
class Meta:
database = db # This model uses the "people.db" database.
db.create_tables([Person])
bob0 = Person(name='Bob0', birthday='4/13/1940')
bob1 = Person(name='Bob1', birthday='5/13/1950')
bob2 = Person(name='Bob2', birthday='3/13/1960')
bob3 = Person(name='Bob3', birthday='3/13/1970')
bob4 = Person(name='Bob4', birthday='3/13/1980')
bob5 = Person(name='Bob5', birthday='3/13/1990')
base = Person(name="base", birthday='3/13/1960')
bob0.save()
bob1.save()
bob2.save()
bob3.save()
bob4.save()
bob5.save()
base.save()
for item in Person.select().where(Person.birthday > base.birthday):
print item.name , item.birthday
输出:
>>> ================================ RESTART ================================
>>>
Bob0 1940-04-13
Bob1 1950-05-13
Bob3 1970-03-13
Bob4 1980-03-13
Bob5 1990-03-13
>>>
如上所示,base = 3/13/1960。所以我不应该在输出中有 Bob0 和 Bob1 !我该如何处理?
请注意,我不想更改数据库中生日的格式。我也不想获取所有行并稍后检查它们!我只想获取所需的行。
【问题讨论】:
-
他们确实在文档中警告说“为了确保比较正常工作,需要对日期进行格式化,以便按字典顺序对日期进行排序”。您是否查看过 peewee 的自定义字段和运算符?
-
@PauloAlmeida 啊,那是不是意味着日期必须以
yyyy/mm/dd的格式保存?如果是这样,现在怎么办?我现在该怎么办?其实我查了文档,没有看到这个表达式。 -
好吧,您没有必须使用任何格式,但如果您可以使用默认格式,那当然会让您的生活变得更轻松。除此之外,据我所知,您将不得不使用自定义字段和/或用户定义的运算符。他们在文档中为后者提供了
mod的示例。对我来说,你会怎么做并不是很明显,因为这不仅仅是一个手术,但我想这是可能的。 -
无意冒犯,但常识是,如果您将日期存储为字符串并希望对其进行排序,则需要按字典顺序对它们进行排序。只需更新您的数据库,就可以省去很多麻烦。