Не удается ничего вставить в базу данных sqlite3 с помощью python

#python #database #sqlite

#python #База данных #sqlite

Вопрос:

Создал эту программу для вставки номера и названия поезда в базу данных. Имена и номера правильные (как доказывает закомментированный оператор печати), но файл db пуст, когда я открываю его с помощью db Reader.

Код:

 import sqlite3
import re

conn=sqlite3.connect('example.db')
c=conn.cursor()
c.execute('''CREATE TABLE train 
               (number text, name text)''')

f=open("train.htm","r")
html=f.read()

num=re.findall(r"(?<=> )[0-9] ", html) #regex to get train number
name=re.findall(r"(?<=<font>)[A-Za-z] [ A-Za-z] ",html) #regex to get train name

j=8

for i in range(0,len(num)):
    #print(num[i],name[j]) #this statement proves that the values are right
    c.execute("INSERT INTO train VALUES (?,?)",(num[i],name[j]))
    j=j 3


conn.close()
  

Но когда я попытался прочитать эту базу данных, она была пустой.

Код для чтения БД:

 import sqlite3

conn=sqlite3.connect('example.db')
c=conn.cursor()

for row in c.execute('SELECT * FROM train'):
    #the program doesn't even enter this block
    print(row)
  

Я попытался открыть эту базу данных в sqlitebrowser, просто чтобы убедиться, что она все еще пуста, поэтому что-то не так с моей первой программой, которая не может вставлять значения. Почему так?

Ответ №1:

Вы должны вызвать

 conn.commit()
  

перед

 conn.close()
  

для того, чтобы вставки были зафиксированы. Это ошибка Python / sqlite.

Комментарии:

1. Интересная ссылка. В этом коде автор не использует объект cursor. Могу ли я избавиться от объекта cursor и напрямую вызывать функции db после открытия базы данных?

2. Использование conn.execute является частью «нестандартного» API sqlite3. Я бы не рекомендовал его использовать, потому что ваш код будет более совместим с другими движками баз данных, если вы будете придерживаться интерфейса DB-API 2.0 .

3. Также неэффективно использовать db.execute много раз, поскольку каждый вызов создает, использует, а затем выбрасывает курсор.