#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
много раз, поскольку каждый вызов создает, использует, а затем выбрасывает курсор.