sqlite COMMIT用于CONNECT还是游标?

wbgh16ku  于 2022-11-14  发布在  SQLite
关注(0)|答案(4)|浏览(203)

这本名为《实用编程:第二版》的书有相互矛盾的代码。这是我的代码的开始:

import sqlite3

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

要提交,我将使用con.commit()cur.commit(),还是各有不同的使用时间?书中有这样一段话:
con.commit()

cur.commit()

Documentation shows con.commit()

uqxowvwt

uqxowvwt1#

我采纳了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运行:

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

irlmq6kh

irlmq6kh2#

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()
wj8zmpe1

wj8zmpe13#

我认为如果您使用指定的游标来提交更改,那么在您的例子中,它应该是cur.Connection.Commit()。无论代码名为db、con还是conn,您都可以在代码末尾使用CONNECT来提交。但是当你的代码变得复杂时,你会有不同的函数来对数据库进行某些操作,如果你只使用连接提交,当出现错误时,你很难发现哪个函数失败了。因此,您为特定操作创建特定游标,当失败时,回溯消息将显示错误的特定游标。

ix0qys7i

ix0qys7i4#

根据@s3n0和@DanielYu的观点,可以用两种不同的方式来处理它们。为了更好地理解这些重叠之处,我不得不列出以下几点:

连接对象

backup
close
commit
create_aggregate
create_collation
create_function
cursor
enable_load_extension
execute
executemany
executescript
in_transaction
interrupt
isolation_level
iterdump
load_extension
rollback
row_factory
set_authorizer
set_progress_handler
set_trace_callback
text_factory
total_changes

游标对象

arraysize
close
connection
description
execute
executemany
executescript
fetchall
fetchmany
fetchone
lastrowid
rowcount
setinputsizes
setoutputsize

相关问题