Python 按定制日期订购SQLite的peewee
我在建立数据库时犯了一个很大的错误,但除了一个特性外,它工作得非常好。在所有需要更改的地方更改程序以使该功能正常工作将是一项耗时数周的艰巨工作,因此我们希望这一解决方案是可能的 问题:我在SQLite数据库中以“dd/mm/yyyy”Python 按定制日期订购SQLite的peewee,python,peewee,Python,Peewee,我在建立数据库时犯了一个很大的错误,但除了一个特性外,它工作得非常好。在所有需要更改的地方更改程序以使该功能正常工作将是一项耗时数周的艰巨工作,因此我们希望这一解决方案是可能的 问题:我在SQLite数据库中以“dd/mm/yyyy”TextField格式存储数据,而不是DateField 需要:我需要在联合查询中按日期排序,以按照我的自定义日期格式获取该联合中最后的记录数。它们来自不同的表,所以我不能仅仅使用rowid或类似的东西来获取最后一个表,我需要按日期进行操作,并且我不能更改数据库中已
TextField
格式存储数据,而不是DateField
需要:我需要在联合查询中按日期排序,以按照我的自定义日期格式获取该联合中最后的记录数。它们来自不同的表,所以我不能仅仅使用rowid或类似的东西来获取最后一个表,我需要按日期进行操作,并且我不能更改数据库中已经存储的数据,因为已经有使用该格式创建的发票(“dd/mm/yyyy”是我所在国家的默认日期格式)
这是捕获数据的查询:
records = []
limited_to = 25
union = (facturas | contado | albaranes | presupuestos)
for record in (union
.select_from(union.c.idunica, union.c.fecha, union.c.codigo,
union.c.tipo, union.c.clienterazonsocial,
union.c.totalimporte, union.c.pagada,
union.c.contabilizar, union.c.concepto1,
union.c.cantidad1, union.c.precio1,
union.c.observaciones)
.order_by(union.c.fecha.desc()) # TODO this is what I need to change.
.limit(limited_to)
.tuples()):
records.append(record)
现在更复杂的是,在将每个数据库转换为联合查询之前,联合已经由一个非常复杂的where
子句为每个数据库创建
所以,我唯一的希望是:有没有办法让订单
采用自定义日期格式
为了澄清,这是一个简单的转换,我需要遵循order\u by
子句,因为如果这是日期格式,我假设SQLite不会有排序问题:
def reverse_date(date: str) -> str:
"""Reverse the date order from dd/mm/yyyy dates into yyyy-mm-dd"""
yyyy, mm, dd = date.split("/")
return f"{yyyy}-{mm}-{dd}"
注意:我遗漏了很多代码,因为我认为这是不必要的。这是理解问题所需的最少代码量。如果您需要更多数据,请告诉我
更新:尝试此解决方案,似乎效果不错。需要更多的测试,但很有希望。如果有人遇到过同样的问题,你可以这样做:
.order_by(sqlfunc.Substr(union.c.fecha, 7)
.concat('/')
.concat(sqlfunc.Substr(union.c.fecha, 4, 2))
.concat('/')
.concat(sqlfunc.Substr(union.c.fecha, 1, 2))
.desc())
2020年快乐结束 正如您所指出的,如果您想让日期正确排序,它们需要采用yyy-mm-dd
格式,这是您应该在SQLite中始终使用的文本格式(或具有相同年、月、日、顺序的内容)
您可以在此处使用re.sub
进行重新排列:
.order_by(re.sub(r'(\d{2})/(\d{2})/(\d{4})',r'\3-\2-\1',
联合会(c.fecha))
在这里,我们使用正则表达式在单独的捕获组中捕获年、月和日组件。然后,我们按照正确的排序顺序替换这些组件。由于peewee模型的工作方式,union.c.fecha
在进行查询之前不是字符串,因此此解决方案失败:(您要么必须更改模型,要么能够执行我的答案所建议的操作(或者使用完全原始的SQLite查询)。不幸的是,这些是您唯一的选择。事实上,您给了我一个非常好的想法,我正在尝试了解,但我希望您能对此有所了解。请参阅我对这个问题的更新。是的,这肯定会起作用(如果它符合其代码的要求)。很高兴为您提供帮助。请以ISO格式存储您的日期字符串,先年后月,然后天。这将在将来避免此问题。请记住,SQLite实际上没有日期类型,它只有日期关联,但是,它只映射到字符串/文本列。我仍然接受您的答案,因为您给了我正确的答案真的。谢谢你,干杯!编辑:我肯定吸取了教训,以后不会再发生了,我有一天会做该死的返工,但这需要几个星期,因为这是一个巨大的ERP。