如何在使用 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_ID
和 URL_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):我删除了 usrID
和 urlID
并使用 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')
我正在尝试存储他们收到的 urerID 和 urls,所以我制作了一个连接器 table Receive
来保存用户 ID 和 url .
这里有2个问题:-
第一个问题:
ID 不会增加 1,而是增加执行代码的次数乘以发送的 url 的数量,这里发生在用户 1 使用代码两次之后:用户 1 在电报聊天中键入 memes
两次并收到 2 个模因 + 2 个模因。然后 user2 使用了该机器人。
第二个问题:
如何检查 Receive
table 是否存在 USER_ID
和 URL_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):我删除了 usrID
和 urlID
并使用 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')