Python |SQLite3: коммит используется на соединении или курсоре? - PullRequest
0 голосов
/ 20 мая 2018

Я нахожусь в процессе изучения Python и sqlite3 через книгу под названием Практическое программирование: 2-е издание.В самой книге есть конфликтующий код.

Если это начало моего кода:

import sqlite3

con = sqlite3.connect('stackoverflow.db')

cur = conn.cursor()

Для фиксации я бы использовал con.commit () или cur.commit().Или есть разные времена, чтобы использовать разные?

Вот картинки из книги:

Это показывает con.commit () con commit

Это показывает cur.commit () cur.commit()

Я проверил онлайн на https://docs.python.org/3/library/sqlite3.html и показывает con.commit () enter image description here

Просто хочу убедиться, что в книге есть ошибка использования cur.commit(), или есть ли особые условия для ее использования.

Заранее спасибо

Ответы [ 3 ]

0 голосов
/ 20 мая 2018

Я воспользовался советом unutbu и попробовал сам.

Пример кода:

import sqlite3

con = sqlite3.connect('db.db')
cur = con.cursor()

data = [('data', 3), ('data2', 69)]

cur.execute('CREATE TABLE Density(Name TEXT, Number INTEGER)')

for i in data:
    cur.execute('INSERT INTO Density VALUES (?, ?)', (i[0], i[1]))

cur.commit()

PyCharm Run:

Traceback (most recent call last):
  File "/Users/User/Library/Preferences/PyCharmCE2018.1/scratches/scratch_2.py", line 13, in <module>
    cur.commit()
AttributeError: 'sqlite3.Cursor' object has no attribute 'commit'

Ошибка в учебнике.cur.commit() не существует.

Спасибо unutbu и s3n0

0 голосов
/ 21 ноября 2018

Я думаю, если вы используете указанный курсор для фиксации изменений, в вашем случае это должен быть cur.connection.commit ().Вы всегда можете использовать connect для фиксации в конце вашего кода, будь то с именем db или con или conn.Но когда ваш код усложняется, у вас будет другая функция для выполнения определенной операции с базой данных, если вы используете только фиксацию соединения, когда есть ошибка, вам будет трудно найти, какая функция не сработала.Таким образом, вы создаете конкретный курсор для конкретной операции, когда это не удалось, сообщение трассировки покажет вам, какой конкретный курсор в случае ошибки.

0 голосов
/ 20 мая 2018

con.commit() и conn.commit() одинаковы ... они являются созданными типами объектов ... в обоих случаях они именуются по-другому ... важно, в основном, .commit(), а не имя, указанное программистом

Существуют типы объектов, которые используют другое имя (con и cur - как вы и просили) для вызова метода.Вы также можете использовать другое имя в своем коде, например:

db = sqlite3.connect('/tmp/filename.db')
cursor = db.cursor()
cursor.execute("CREATE TABLE ....
               .... some DB-API 2.0 commands ....
               ")
db.commit()

Пожалуйста, проверьте снова веб-страницу https://docs.python.org/3/library/sqlite3.html.Вы забыли скопировать эти две строки с веб-страницы:

import sqlite3
conn = sqlite3.connect('example.db')

И затем продолжить код (просто скопировал его):

c = conn.cursor()

# Create table
c.execute('''CREATE TABLE stocks
             (date text, trans text, symbol text, qty real, price real)''')

# Insert a row of data
c.execute("INSERT INTO stocks VALUES ('2006-01-05','BUY','RHAT',100,35.14)")

# Save (commit) the changes
conn.commit()

# We can also close the connection if we are done with it.
# Just be sure any changes have been committed or they will be lost.
conn.close()
...