Windows 10 上帶有 sqlite3 的 Python 3.10.2。對 Python 來說相對較新,但我在 1997-2005 年左右對 Perl 非常有經驗。
用頭撞了三天。從多個角度進行攻擊。沒有成功。我正在尋求指導,因為在沒有幫助打開電燈開關的情況下,我看不到自己在這一點上取得進展。
我的整個應用程式PRAW用于抓取 subreddit 并將提交內容放入表格中。然后,我們一次一行地瀏覽那個 reddit 表,掃描selftext列中的任何 URL。忽略一些。清理別人。將我們想要的插入另一個表。稍后,我將瀏覽該表,下載每個 URL。
我的問題是,如果我運行下面的代碼,并且INSERT注釋掉,我的print(dl_lnk[0])行會列印出 reddit 表中所有(當前)1,400 行的結果。但是如果我激活該INSERT行,它似乎只處理表中的第一行。我可以假設是這種情況,因為列印行僅顯示幾行,并且它們都與同一用戶和相同/相似的 URL 有關。
我不明白為什么會這樣。我不認為這是因為 SQL 中的錯誤(盡管在代碼中訪問 SQL 例外的選項似乎比我以前在 Perl 中的選擇要少,本質上)。但我也沒有看到任何關于我的流邏輯的任何內容,它會在 SQL INSERT 發生時使其僅處理一行,但在注釋掉時處理所有行。
def scanForDownloadLinks(db):
cursorObj = db.cursor()
# Get all records from 'reddit' submission table.
for reddit_row in cursorObj.execute('''SELECT name, author, subreddit, permalink, title, selftext FROM reddit ORDER BY CREATED_UTC ASC'''):
# Build URL-matching regex
link_regex = re.compile('((https?):((//)|(\\\\)) ([\w\d:#@%/;$()~_?\ -=\\\.&](#!)?)*)', re.DOTALL)
# Find all URLs in this reddit submission's selftext column.
dl_links = re.findall(link_regex, reddit_row[5])
# Go through each link, disregard links we don't want, clean up links we do, then insert them into the dl_link table
for dl_lnk in dl_links:
print(dl_lnk[0])
cursorObj.execute('''INSERT INTO dl_ledger (name, title, dl_link) VALUES(?,?,?)''', (reddit_row[0], str(reddit_row[4]), dl_lnk[0]))
db.commit()
uj5u.com熱心網友回復:
SELECT您應該對andINSERT查詢使用不同的游標。當您使用相同的游標時,會INSERT重置游標,因此您無法獲取剩余的行。
或者,您可以使用cursorObj.fetchall()將SELECT查詢的所有結果作為串列獲取并回圈遍歷,而不是遍歷游標本身。但是如果有很多行,這將使用大量記憶體,而回圈游標是增量的。但是 1400 行可能不是問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/434087.html
上一篇:Class.forName("org.sqlite.JDBC")vsJDBC.PREFIX加載JDBC類
下一篇:SQL-如何從一列中減去值
