ValueError при получении DateTime из SQLite - PullRequest
0 голосов
/ 28 апреля 2020

Я пишу приложение Flask, используя SQLAlchemy и SQlite.

Модель выглядит следующим образом:

    class User(UserMixin, db.Model):
        __tablename__ = 'users'
        id = db.Column(db.Integer, primary_key=True)
        username = db.Column(db.String(64), unique=True, index=True)
        member_since = db.Column(db.DateTime())

        def __repr__(self):
           msg = f"<User username: {self.username}, id: {self.id}, member_since: {self.member_since}"
           return msg

Когда я выполняю следующий тест:

        import unittest
        from app import create_app, db
        from app.models import User
        from datetime import datetime

        class UserModelTestCase(unittest.TestCase):
            def setUp(self):
                self.app = create_app('testing')
                self.app_context = self.app.app_context()
                self.app_context.push()
                db.create_all()

            def test_valid_confirmation_token(self):
                print("Create and save new user...")
                u1 = User(password='cat', username="John", member_since=datetime.utcnow())
                print(u1)
                db.session.add(u1)
                db.session.commit()
                print("Retrieving saved user from DB...")
                u2 = User.query.filter_by(username="John").first()
                print(u2)

Я получаю следующее исключение:

Создание и сохранение нового пользователя ...
Имя пользователя: John, id: None, member_since: 2020-04-28 05:04: 18.570841
Извлечение сохраненного пользователя из БД ...

Выполнение теста 1 за 1,297 с

СБОЙ (ошибки = 1)

Ошибка
Трассировка (самая последняя последний вызов):
Файл "C: \ Users \ morne \ AppData \ Local \ Programs \ Python \ Python37 \ lib \ unittest \ case.py", строка 59, в testPartExecutor
yield
Файл "C: \ Users \ morne \ AppData \ Local \ Programs \ Python \ Python37 \ lib \ unittest \ case.py", строка 615, в прогоне
testMethod ()
Файл "C: \ Users \ morne \ PycharmProjects \ Flasky \ tests \ 1.py ", строка 21, в test_valid_confirmation_token
u2 = User.query.filter_by (username =" John "). First ()
File" C: \ Users \ Морн \ PycharmProjects \ Flasky \ venv \ Lib \ сайт-пакет s \ sqlalchemy \ orm \ query.py ", строка 3300, в первом
ret = list (self [0: 1])
Файл" C: \ Users \ morne \ PycharmProjects \ Flasky \ venv \ lib \ site-packages \ sqlalchemy \ orm \ query.py ", строка 3078, в getitem
список возврата (res)
Файл" C: \ Users \ morne \ PycharmProjects \ Flasky \ venv \ lib \ site-packages \ sqlalchemy \ orm \ loading.py ", строка 101, в случаях
cursor.close ()
Файл" C: \ Users \ morne \ PycharmProjects \ Flasky \ venv \ lib \ site-packages \ sqlalchemy \ util \ langhelpers.py ", строка 69, в выход
exc_value, with_traceback = exc_tb,
файл" C: \ Users \ morne \ PycharmProjects \ Flasky \ venv \ lib \ site-packages \ sqlalchemy \ util \ compat.py ", строка 178, в повышение_
повышение исключения
Файл" C: \ Users \ morne \ PycharmProjects \ Flasky \ venv \ lib \ site-packages \ sqlalchemy \ orm \ loading.py ", строка 81, в случаях
rows = [pro c (row) для строки в выборке]
File" C: \ Пользователи \ morne \ PycharmProjects \ Flasky \ venv \ lib \ site-packages \ sqlalchemy \ orm \ loading.py ", строка 81, в
строки = [pro c (строка) для строки в выборке]
Файл "C: \ Users \ morne \ PycharmProjects \ Flasky \ venv \ lib \ site-packages \ sqlalchemy \ orm \ loading.py ", строка 645, в _instance
заполнителях,
файл" C: \ Users \ morne \ PycharmProjects \ Flasky \ venv \ lib \ site-packages \ sqlalchemy \ orm \ loading.py " , строка 782, в _populate_partial
dict_ [key] = getter (row)
ValueError: час должен быть в 0..23

Я подтвердил, что значение DateTime действительно зафиксировано в базу данных. Поэтому я считаю, что исключение возникает, когда SQLAlchemy пытается преобразовать значение DateTime в таблице SQLite в Python тип datetime?

Любая помощь будет принята с благодарностью.

EDIT:
Обратите внимание, что в консоли python я могу выполнить следующее:

>>> from sqlalchemy import create_engine  
>>> engine = create_engine('sqlite:///data-test.sqlite')  
>>> result = engine.execute("select * from users")  
>>> row = result.fetchone()  
>>> row  
>>> (1, None, 'John', 'pbkdf2:sha256:150000$x3DBvNDA$8ed0a9c11d5bc1f4772ac5b6167402044f9bc865e22f83c813d86f4f0c9678ec', None, 0, None, None, None, '2020-04-28 05:04:18.570841')  
...