使用 sqlite3.connect 查询数据库并检查匹配结果

query database using sqlite3.connect and check for matching results

我的 Discord 机器人查询数据库并检查是否有匹配的条目。为了检查匹配的条目,我使用了像 这样的 if 语句。但不知何故,我的代码没有按预期工作:

def check_db_entry():

    message = 'Some Message.'
    user_id : int = 1234

    # check if user already exists in database
    # connect to database
    con = get_connection() 
    cur = con.cursor() 

    # search in database
    cur.execute('SELECT id FROM user WHERE id=?', user_id)
    result = cur.fetchone()

    if result:
        print(f'\nUser found in db with {user_id}.\n')
    else:
        print(f'\nNo user found in db with {user_id}.\n Create user')

    con.commit()
    con.close()
我的 2 个打印语句中的

None 实际打印出来了。这很奇怪,因为 ifelse 语句应该有效。

连接到我的数据库成功。我已经用 print(str(result)) 测试了很多次,这里是我的数据库设置代码:

def create_database():

    if not os.path.exists('db'):
        os.mkdir('db')

    # database setup
    try:
        con = sqlite3.connect(SQLITE_DB_PATH)
        cur = con.cursor()
        cur.execute('CREATE TABLE IF NOT EXISTS user (id INTEGER NOT_NULL, balance REAL NOT_NULL, text1 TEXT NOT_NULL, text2 TEXT NOT_NULL)')
        con.commit()
        con.close()
    except Error as e:
        print('Failed to setup database.\n' + e)
        exit(1)


# connect to the database, returns connection object
def get_connection():

    try:
        con = sqlite3.connect(SQLITE_DB_PATH)
        return con
    except:
        print('Unable to connect to database. Please try again later.\n')
        exit(1)

我是不是漏掉了什么?

fetchone() returns None,这和false不一样,如果查询没有return任何行,这就是你应该检查一下。

所以改成这样:

if result is None:
    print(f'\nNo user found in db with {user_id}.\n Create user')
else:
    print(f'\nUser found in db with {user_id}.\n') 

此外,您应该将参数 user_id 作为元组传递:

cur.execute('SELECT id FROM user WHERE id=?', (user_id,))

此外,NOT_NULL 对 SQLite 没有任何意义,尽管它不会抛出错误。
你应该使用 NOT NULL:

cur.execute('DROP TABLE IF EXISTS user;') # execute once to drop he table that you created
cur.execute('CREATE TABLE IF NOT EXISTS user (id INTEGER NOT NULL, balance REAL NOT NULL, text1 TEXT NOT NULL, text2 TEXT NOT NULL)')