如何在使用 python 检查是否存在时在 sqlite3 表中插入数据

how insert data in the sqlite3 tables while checking if exist using python

我正在尝试存储他们收到的 urerID 和 urls,所以我制作了一个连接器 table Receive 来保存用户 ID 和 url .

这里有2个问题:-

第一个问题: ID 不会增加 1,而是增加执行代码的次数乘以发送的 url 的数量,这里发生在用户 1 使用代码两次之后:用户 1 在电报聊天中键入 memes 两次并收到 2 个模因 + 2 个模因。然后 user2 使用了该机器人。

第二个问题: 如何检查 Receive table 是否存在 USER_IDURL_ID aka :知道用户是否收到模因?

这里是 URLS table:

表格:

CREATE TABLE USERS ( 
userID INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
chatID INT(10) UNIQUE

);
CREATE TABLE URLS ( 
urlID INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT ,
linkID TEXT UNIQUE 

);
CREATE TABLE Receive ( 
USER_ID INTEGER ,
URL_ID INTEGER ,
PRIMARY KEY (USER_ID , URL_ID)

)

代码:

def from_red():

for subm in reddit.subreddit('Memes').hot(limit=limit):

        urlId = subm.url[18:][:-4] 
        info = last_data('getUpdates')
        userid = get_chat_id(info)

        #curr.execute('SELECT USER_ID and URL_ID FROM Receive ')
        #e = curr.fetchone()

        curr.execute('INSERT OR IGNORE INTO USERS (chatID) VALUES (?) ', (userid ,))
        curr.execute('SELECT userID FROM USERS WHERE chatID = ? ', (userid , ))
        id1 = curr.fetchone()[0]
        print(id1)

        curr.execute('INSERT OR IGNORE INTO URLS (linkID) VALUES (?) ', (urlId ,))
        curr.execute('SELECT urlID FROM URLS WHERE linkID = ? ', (urlId , ))
        id2 = curr.fetchone()[0]
        print(id2)

        curr.execute('INSERT OR REPLACE INTO Receive (USER_ID , URL_ID) VALUES (? , ?)' ,(id1 , id2))


        send_pic(subm.url , subm.title)
        time.sleep(1.5)

        connection.commit()

问题是您不断插入具有相同主键的内容。所有用户都插入 user-id = 1。行

curr.execute(
   'INSERT OR IGNORE INTO USERS (ID , chatID) VALUES (1 , ?) ', 
   (userid , ))

将使用值 1 作为 table 的用户 ID 列,并使用变量 userid 的值作为聊天 ID。下次您尝试向 table 插入值时,它会注意到主键“1”已被使用,因此不会插入任何内容。

更新:

仅插入第一个 URL,根据您正在打印的日志,您几乎总是进入 if 语句的第一个分支 - print('exists')。这就是为什么您甚至不尝试向数据库添加新条目的原因。

对于第一个问题(ids 没有增加 1):我删除了 usrIDurlID 并使用 rowid 代替

curr.executescript('''
CREATE TABLE IF NOT EXISTS USERS ( 

chatID INT(10) UNIQUE,

);
CREATE TABLE IF NOT EXISTS URLS ( 

linkID TEXT UNIQUE 

);
CREATE TABLE IF NOT EXISTS Receive ( 
USER_ID INTEGER ,
URL_ID INTEGER ,
PRIMARY KEY (USER_ID , URL_ID)

)

''')

固定码:

curr.execute('SELECT rowid FROM USERS WHERE chatID = ? ', (userid , ))
id1 = curr.fetchone()[0]

curr.execute('SELECT rowid FROM URLS WHERE linkID = ? ', (urlId , ))
id1 = curr.fetchone()[0]

对于第二个问题(检查 userID 和 url):

        try:
            curr.execute('INSERT INTO Receive (USER_ID , URL_ID) VALUES (? , ?)' ,(id1 , id2))
            send_pic(subm.url , subm.title)
            time.sleep(1.5)
            connection.commit()

        except sqlite3.IntegrityError as e:
            ...
            print('Anything else')