Скрипт на Python 3.8 не видит им же созданную ДБ SQLite

BloodyMaria

Новичок
Пользователь
Июл 15, 2020
3
0
1
Всем добрый день!

Недавно изучаю Питон, решила попробовать разобраться с базами данных на примере встроенного SQLite3, для чего написала вот такой скрипт:

import os
import sqlite3

a = int(5)
b = "абвгд"
way = os.getcwd()
print (way)


conn = sqlite3.connect("Test.db")
cursor = conn.cursor()
if "Test.db" not in os.listdir():
cursor.execute("CREATE TABLE Test (testint int(1), testvar varchar (10))")
conn.commit()
base = str(way)+"\Test.db"
if os.path.exists(base):
print("База найдена")
else:
print("Неверный путь")

sql = "INSERT INTO Test VALUES(?,?);"
cursor.execute(sql, (a, b))
conn.commit()

sql = "SELECT testvar FROM Test WHERE testint = 5 LIMIT 1"
cursor.execute(sql)
b = cursor.fetchall()
print(b)

Идея была в том, чтобы создать ДБ, занести в неё данные и тут же проверить, как они считываются. Но на этапе попытки записать данные стандартный Python Shell выдаёт следующее со ссылкой на строку 27: sqlite3.OperationalError: no such table: Test
При этом в папке, откуда я запускаю скрипт, Test.db успешно создаётся, я её там вижу. Пробовала ещё раз указывать путь к папке перед sql-запросом, но это, ожидаемо, не помогло. os.path.exists файл тоже видит. Может, у меня создаётся файл без таблицы Test в нём? Но если да, то что я делаю не так при создании базы? Версия pip 20.01.01
Пробовала прописывать INSERT INTO Test.db - не помогает. Каким-то образом у меня получилось пару раз добиться того, чтобы всё заработало, но потом я решила прописать sql-запрос в отдельной переменной, увидев такой вариант на формуах, и теперь опять ничего не работает. Причём и при попытке убрать переменную sql и прописать запрос сразу в cursor.execute - тоже.

Насколько вообще sqlite3 нежный в плане синтаксиса запроса?
 
Последнее редактирование:

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Вот тут можете посмотреть примеры создания таблиц и запросов для sqlite: ссылка.
 
  • Мне нравится
Реакции: Asgardov

BloodyMaria

Новичок
Пользователь
Июл 15, 2020
3
0
1
Вот тут можете посмотреть примеры создания таблиц и запросов для sqlite: ссылка.

Спасибо, уже перелопатила кучу руководств и на русском, и на английском, но в скрипте выше - хоть убей не могу понять, что не так, и почему пару раз он всё-таки запустился, а потом снова перестал работать.
 

Asgardov

Пользователь
Пользователь
Май 23, 2020
38
10
8
Спасибо, уже перелопатила кучу руководств и на русском, и на английском, но в скрипте выше - хоть убей не могу понять, что не так, и почему пару раз он всё-таки запустился, а потом снова перестал работать.
Test.db это файл базы данных.
На шаге
conn = sqlite3.connect("Test.db") создаётся файл бд (Test.db).
Далее вы проверяете условие:
if "Test.db" not in os.listdir():
так как файл существует то мы пролетаем мимо шага создания таблицы:
cursor.execute("CREATE TABLE Test (testint int(1), testvar varchar (10))")
conn.commit()

В результате у нас есть пустая БД (без таблиц)
Следующим шагом вы пытаетесь закинуть в таблицу (которой нет) строку.
И получаете ошибку:
27: sqlite3.OperationalError: no such table: Test

У вас ошибка в логике.
 
  • Мне нравится
Реакции: BloodyMaria

BloodyMaria

Новичок
Пользователь
Июл 15, 2020
3
0
1
Test.db это файл базы данных.
На шаге
conn = sqlite3.connect("Test.db") создаётся файл бд (Test.db).
Далее вы проверяете условие:
if "Test.db" not in os.listdir():
так как файл существует то мы пролетаем мимо шага создания таблицы:
cursor.execute("CREATE TABLE Test (testint int(1), testvar varchar (10))")
conn.commit()

В результате у нас есть пустая БД (без таблиц)
Следующим шагом вы пытаетесь закинуть в таблицу (которой нет) строку.
И получаете ошибку:
27: sqlite3.OperationalError: no such table: Test

У вас ошибка в логике.

Спасибо огромное!

До меня никак не доходил тот факт, что создание объекта связи в sqlite3 = создание файла, если он не создан. Хотя были подозрения, что проблема в том, что я создаю пустую БД. Тогда завтра ещё погуглю синтаксис SQL и попробую адекватно переписать проверку на существование именно не файла, а таблицы в нём.
 

Форум IT Специалистов