Недопустимый литерал для int() с основанием 10: b'13 18:33:25' [закрыто]

Я создаю сайт-портфолио с блогом на нем. Все работало отлично, но внезапно появилась вышеупомянутая ошибка, когда я пытаюсь перейти по ссылке на свой блог, и он говорит, что что-то не так с моей ссылкой bootstrap css: enter image description here

сообщите мне, если вам понадобится что-то еще для поиска решения. Спасибо

Sqlite3 не имеет собственного типа date, но модуль sqlite3 в Python автоматически регистрирует функции адаптера, которые будут преобразовывать date и datetime объекты при вставке и извлечении их из базы данных. Django использует эту функциональность, когда он настроен на использование Sqlite.

При получении даты функция sqlite3 преобразователя даты предполагает, что получит байтовую строку вида b'YY-mm-dd', поэтому пытается разделить ее на b'-', чтобы создать объект даты.

>>> import datetime as dt
>>> dt.date(*map(int, b'2021-09-26'.split(b'-')))
datetime.date(2021, 9, 26)

Однако, если значение является datetime bytestring, преобразование не удается с ошибкой, как в вопросе:

>>> date(*map(int, b'2021-09-26 09:16:00.000000'.split(b'-')))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: b'26 09:16:00.000000'

Мы можем воспроизвести это поведение с помощью sqlite3:

conn = sqlite3.connect('so69236477.db', detect_types=sqlite3.PARSE_DECLTYPES)

with conn:
    cur = conn.cursor()
    datetime = dt.datetime.now()
    datestring = datetime.strftime('%Y-%m-%d %H:%M:%S')
    cur.execute("""INSERT INTO t69236477 (date_posted) VALUES (?)""", (datestring,))
    conn.commit()
    cur.execute("""SELECT date_posted FROM t69236477""")
conn.close()

Resulting in this traceback:

Traceback (most recent call last):
  File "/home/me/python_projects/so38/so69236477.py", line 18, in <module>
    cur.execute("""SELECT date_posted FROM t69236477""")
  File "/usr/local/lib/python3.9/sqlite3/dbapi2.py", line 64, in convert_date
    return datetime.date(*map(int, val.split(b"-")))
ValueError: invalid literal for int() with base 10: b'26 09:28:49'

Похоже, что в какой-то момент столбец был заполнен строками datetime вместо дат. Есть два шага, чтобы исправить это.

  • Сначала просмотрите свой код, чтобы найти места, где устанавливается date_posted, и убедитесь, что результатом является date, а не datetime.

  • Во-вторых, исправьте данные. Вы можете сделать это, выполнив следующий оператор SQL

update t69236477 set date_posted = substr(date_posted, 11, -10)

заменяет имя вашей таблицы на t69236477. Оператор заменяет все значения date_posted их первыми десятью символами, то есть только частью 'YY-mm-dd'.

Вы можете выполнить SQL в sqlite3.exe или в интерпретаторе Python, подключившись к базе данных с помощью модуля sqlite3. Сначала скопируйте файл базы данных, чтобы при необходимости можно было восстановить ошибки.

Вот как это делается в sqlite3.exe (но в Linux).

$ sqlite3 so69236477.db 
SQLite version 3.28.0 2019-04-16 19:49:53
Enter ".help" for usage hints.
sqlite> select date_posted from t69236477;
2021-09-26 09:37:53
sqlite> update t69236477 set date_posted = substr(date_posted, 11, -10);
sqlite> select date_posted from t69236477;
2021-09-26
Вернуться на верх