Python | SQLite3:是否在连接或游标上使用了提交?

时间:2018-05-19 21:20:16

标签: python python-3.x sqlite commit

我正在通过一本名为Practical Programming:2nd Edition的书来学习python和sqlite3。 在本书中,它有相互冲突的代码。

如果这是我的代码的开头:

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 :(得分:1)

con.commit()conn.commit()是相同的...它们是创建的对象类型...在这两种情况下它们都被命名为... important主要是.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()

答案 1 :(得分:1)

我接受了unutbu的建议,并亲自尝试过。

示例代码:

public static string GetDateString(DateTime inputDate)
    {
        var dateDiff = (DateTime.Today - inputDate.Date).TotalDays;
        if (dateDiff == 0)
        {
            return "TODAY";
        }
        else if(dateDiff == 1)
        {
            return "YESTERDAY";
        }
        else if(dateDiff == -1)
        {
            return "TOMORROW";
        }
        else
        {
            return inputDate.ToShortDateString();
        }
    }

PyCharm Run:

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

教科书出错。 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' 不存在。

感谢unutbu和s3n0

答案 2 :(得分:0)

我认为,如果您使用指定的游标提交更改,则应为cur.connection.commit()。 无论代码名为db还是con或conn,您始终可以使用connect在代码末尾提交。 但是,当您的代码变得复杂时,您将具有不同的功能来对数据库执行某些操作,如果仅使用连接提交,则当存在错误时,您将很难找到哪个函数失败。因此,您将为特定的操作创建特定的游标,如果操作失败,则回溯消息将向您显示错误时哪个特定的游标。