Как преобразовать CharField в DateTimeField в peewee на лету? - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть модель, которую я создал на лету для peewee.Примерно так:

class TestTable(PeeweeBaseModel):
    whencreated_dt = DateTimeField(null=True)
    whenchanged = CharField(max_length=50, null=True)

Я загружаю данные из текстового файла в таблицу, используя peewee, столбец «когда изменено» содержит все даты в формате «% Y-% m-% d% H:% M:% S 'как столбец varchar.Теперь я хочу преобразовать текстовое поле «когда поменяно» в формат даты и времени в «когда».Я пробовал несколько вещей ... Я закончил с этим:

# 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": я пытаюсь преобразовать "когда создан"to 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» в datetime, поместите его в «whencreated_dt» и сохраните каждую строку.

С уважением, Свен

1 Ответ

0 голосов
/ 19 декабря 2018

Ваш пример:

to_execute = "table.update({table.%s : datetime.strptime(table.%s, '%%Y-%%m-%%d %%H:%%M:%%S')}).execute()" % ('whencreated_dt', 'whencreated')

Не будет работать.Зачем?Потому что datetime.strptime является функцией Python и работает на Python.Запрос UPDATE работает в базе данных.Как, черт возьми, база данных собирается магически передавать значения строк в datetime.strptime?Как БД вообще узнает, как вызывать такую ​​функцию?

Вместо этого вам нужно использовать функцию SQL - функцию, которая выполняется базой данных.Например, Postgres:

TestTable.update(whencreated_dt=whenchanged.cast('timestamp')).execute()

Это эквивалентный SQL:

UPDATE test_table SET whencreated_dt = CAST(whenchanged AS timestamp);

Это должно заполнить столбец для вас, используя правильный тип данных.Для других баз данных, обратитесь к их руководствам.Обратите внимание, что SQLite не имеет выделенный тип данных даты / времени, а функция datetime использует строки в формате Ymd H: M: S.

...