使用 SQL INSERT 激活的记录迭代在第一组 INSERTS 后停止,但使用 PRINT 测试遍历每条记录(根据需要)
Iterating through records with SQL INSERT activated stops after first set of INSERTS, but using PRINT to test goes through EVERY record (as desired)
Python 3.10.2 with sqlite3 on Windows 10. Python 相对较新,但我在 1997-2005 年左右对 Perl 很有经验。
我脑袋撞了三天。从多个角度攻击。没有成功。我正在寻求指导,因为如果没有帮助打开电灯开关,我看不到自己在这一点上取得进步。
我的整个应用程序利用 PRAW
抓取一个 subreddit 并将提交内容放入 table。然后,我们一次浏览 reddit table 一行,扫描 selftext
列以查找任何 URL。无视一些。清理别人。将我们想要的插入另一个table。稍后,我将浏览 table,下载每个 URL。
我的问题是,如果我 运行 下面的代码,INSERT
被注释掉,我的 print(dl_lnk[0])
行打印出所有(当前)1,400 行的结果reddit table。但是如果我激活 INSERT
行,它似乎只处理 table 中的第一行。我可以假设是这种情况,因为打印行只显示几行,而且它们都是关于同一个用户和 same/similar URL.
我不明白这是为什么。我不认为这是因为 SQL 中的错误(虽然与我以前在 Perl 中使用的相比,在代码中访问 SQL 异常的选项似乎更少,本质上)。但是我也没有看到任何有关我的流程逻辑的信息,当发生 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()
您应该对 SELECT
和 INSERT
查询使用不同的游标。当您使用相同的游标时,INSERT
会重置游标,因此您无法获取剩余的行。
或者您可以使用 cursorObj.fetchall()
将 SELECT
查询的所有结果作为列表获取并循环遍历它,而不是遍历游标本身。但是如果有很多行,这将使用大量内存,而遍历游标是增量的。但是1400行可能不是问题。
Python 3.10.2 with sqlite3 on Windows 10. Python 相对较新,但我在 1997-2005 年左右对 Perl 很有经验。
我脑袋撞了三天。从多个角度攻击。没有成功。我正在寻求指导,因为如果没有帮助打开电灯开关,我看不到自己在这一点上取得进步。
我的整个应用程序利用 PRAW
抓取一个 subreddit 并将提交内容放入 table。然后,我们一次浏览 reddit table 一行,扫描 selftext
列以查找任何 URL。无视一些。清理别人。将我们想要的插入另一个table。稍后,我将浏览 table,下载每个 URL。
我的问题是,如果我 运行 下面的代码,INSERT
被注释掉,我的 print(dl_lnk[0])
行打印出所有(当前)1,400 行的结果reddit table。但是如果我激活 INSERT
行,它似乎只处理 table 中的第一行。我可以假设是这种情况,因为打印行只显示几行,而且它们都是关于同一个用户和 same/similar URL.
我不明白这是为什么。我不认为这是因为 SQL 中的错误(虽然与我以前在 Perl 中使用的相比,在代码中访问 SQL 异常的选项似乎更少,本质上)。但是我也没有看到任何有关我的流程逻辑的信息,当发生 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()
您应该对 SELECT
和 INSERT
查询使用不同的游标。当您使用相同的游标时,INSERT
会重置游标,因此您无法获取剩余的行。
或者您可以使用 cursorObj.fetchall()
将 SELECT
查询的所有结果作为列表获取并循环遍历它,而不是遍历游标本身。但是如果有很多行,这将使用大量内存,而遍历游标是增量的。但是1400行可能不是问题。