Недопустимый литерал для 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