python3sqlite行在Ubuntu上不会被删除,但在Windows上会被删除

2024-10-04 01:30:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图删除SQLite3中的一行,在windows上它删除了该行,但在Ubuntu上它不会。我不确定是什么原因/如何修复它。两个系统都运行python3.6.5,我没有用pip安装SQLite3。你知道吗

我正在运行下面的脚本,它创建一个数据库sqlite,创建具有(键、名称)的用户表并插入一个用户。然后应将其移除:

import sqlite3

class DBHelper:
    def __init__(self, dbname="db.sqlite"):
        self.dbname = dbname
        self.conn = sqlite3.connect(dbname)
        self.conn.set_trace_callback(print)

    def setup(self):
        stmt = "CREATE TABLE IF NOT EXISTS users (key text PRIMARY KEY, name text)"
        self.conn.execute(stmt)
        stmt = "INSERT INTO users (key, name) VALUES ('Acf233146328cea01fe9648acc3053fa', 125368500)"
        self.conn.execute(stmt)
        self.conn.commit()

    def delete_user(self, name, key):
        stmt = "DELETE FROM users WHERE name = (?) AND key = (?)"
        args = (name, key)
        self.conn.execute(stmt, args)
        self.conn.commit()

    def get_all(self):
        stmt = "SELECT name, key FROM users"
        return [x for x in self.conn.execute(stmt)]


def get_db():
    db = DBHelper()
    return db


name = 125368500
key = 'Acf233146328cea01fe9648acc3053fa'

print('Delete {0} {1}'.format(name, key))
db = get_db()
db.setup()
db.delete_user(name, key)
for user_data in db.get_all():
    print('{0} {1}'.format(user_data[0], user_data[1]))

在Ubuntu上返回(不正确):

Delete 125368500 Acf233146328cea01fe9648acc3053fa
CREATE TABLE IF NOT EXISTS users (key text PRIMARY KEY, name text)
BEGIN
INSERT INTO users (key, name) VALUES ('Acf233146328cea01fe9648acc3053fa', 125368500)
COMMIT
BEGIN
DELETE FROM users WHERE name = (125368500) AND key = ('Acf233146328cea01fe9648acc3053fa')
COMMIT
SELECT name, key FROM users
125368500 Acf233146328cea01fe9648acc3053fa

在Windows上返回(正确):

Delete 125368500 Acf233146328cea01fe9648acc3053fa
CREATE TABLE IF NOT EXISTS users (key text PRIMARY KEY, name text)
BEGIN
INSERT INTO users (key, name) VALUES ('Acf233146328cea01fe9648acc3053fa', 125368500)
COMMIT
BEGIN
DELETE FROM users WHERE name = (125368500) AND key = ('Acf233146328cea01fe9648acc3053fa')
COMMIT
SELECT name, key FROM users

更新:看来我遇到了SQLite 3.11.0中引入的错误:https://sqlite.org/src/info/ef360601 由于ubuntu16.04.4lts默认带有3.11.0,我需要更新版本。你知道吗

更新2:通过将name更改为string来更新打字也可以修复它。在sqlite错误报告中似乎也是这样。你知道吗


Tags: keytextnamefromselfexecutedbsqlite
1条回答
网友
1楼 · 发布于 2024-10-04 01:30:49

因为我使用的是带有SQLite的Ubuntu16.04,所以它附带了3.11.0版,它有以下错误:https://sqlite.org/src/info/ef360601

要解决这个问题,我需要在创建表/插入时使用正确的类型,然后才能删除行。你知道吗

固定代码:

import sqlite3

class DBHelper:
    def __init__(self, dbname="db.sqlite"):
        self.dbname = dbname
        self.conn = sqlite3.connect(dbname)
        self.conn.set_trace_callback(print)

    def setup(self):
        stmt = "CREATE TABLE IF NOT EXISTS users (key text PRIMARY KEY, name text)"
        self.conn.execute(stmt)
        stmt = "INSERT INTO users (key, name) VALUES ('Acf233146328cea01fe9648acc3053fa', '125368500')"
        self.conn.execute(stmt)
        self.conn.commit()

    def delete_user(self, name, key):
        stmt = "DELETE FROM users WHERE name = (?) AND key = (?)"
        args = (name, key)
        self.conn.execute(stmt, args)
        self.conn.commit()

    def get_all(self):
        stmt = "SELECT name, key FROM users"
        return [x for x in self.conn.execute(stmt)]


def get_db():
    db = DBHelper()
    return db


name = '125368500'
key = 'Acf233146328cea01fe9648acc3053fa'

print('Delete {0} {1}'.format(name, key))
db = get_db()
db.setup()
db.delete_user(name, key)
for user_data in db.get_all():
    print('{0} {1}'.format(user_data[0], user_data[1]))

相关问题 更多 >