【发布时间】:2018-12-19 06:06:41
【问题描述】:
我有我为 peewee 即时创建的模型。像这样的:
class TestTable(PeeweeBaseModel):
whencreated_dt = DateTimeField(null=True)
whenchanged = CharField(max_length=50, null=True)
我使用 peewee 将数据从文本文件加载到表中,“whenchanged”列包含格式为 '%Y-%m-%d %H:%M:%S' 的所有日期作为 varchar 列。现在我想将文本字段“whenchanged”转换为“whencreated_dt”中的日期时间格式。 我尝试了几件事......我最终得到了这个:
# Initialize table to TestTable
to_execute = "table.update({table.%s : datetime.strptime(table.%s, '%%Y-%%m-%%d %%H:%%M:%%S')}).execute()" % ('whencreated_dt', 'whencreated')
失败并显示“TypeError:strptime() 参数 1 必须是 str,而不是 CharField”:我正在尝试将“whencreated”转换为 datetime,然后将其分配给“whencreated_dt”。
我尝试了一个变体......例如工作顺利:
# Initialize table to TestTable
to_execute = "table.update({table.%s : datetime.now()}).execute()" % (self.name)
exec(to_execute)
但这当然只是当前日期时间,而不是其他字段。
有人知道解决办法吗?
编辑...我最终确实找到了解决方法...但我仍在寻找更好的解决方案...解决方法:
all_objects = table.select()
for o in all_objects:
datetime_str = getattr( o, 'whencreated' )
setattr(o, 'whencreated_dt', datetime.strptime(datetime_str, '%Y-%m-%d %H:%M:%S'))
o.save()
遍历表中的所有行,获取“whencreated”。将“whencreated”转换为日期时间,放入“whencreated_dt”,保存每一行。
问候, 斯文
【问题讨论】:
-
你为什么要使用 getattr(o, 'whencreated') 而你可以只写“o.whencreated”?当您可以只写“o.whencreated_dt = datetime...) 时,为什么还要使用 setattr?
标签: peewee