我试图使用多线程将raw_html插入postgres,但无法获得要插入的数据并继续获取
LINE 1: INSERT INTO raw_html VALUES b'<!DOCTYPE html><html lang="en"...
^
Error: syntax error at or near "b'<!DOCTYPE html我不知道b在这些字符串前面做了什么(我在网上也找不到任何解释b是什么的东西),我认为这就是插入失败的原因。我还试图让raw_html字符串转换为元组,因为我认为它需要是一个元组,才能接受它。我想不出下一步该做什么来解决这两个问题。任何方向都值得赞赏:
更新:
def execute_values(LST):
DB_HOST = "localhost"
DB_NAME = "yellow_pages_scraper"
DB_USER = "justinbenfit"
DB_PASS = "postgres"
DB_URL = "mydburl"
conn = psycopg2.connect(dbname=DB_NAME, user=DB_USER, password=DB_PASS, host=DB_HOST)
cur = conn.cursor()
try:
LST = tuple(LST)
for L in LST:
cur.execute("INSERT INTO raw_html VALUES (?)", (L.decode('utf-8'),))
conn.commit()
except (Exception, psycopg2.DatabaseError) as error:
print("Error: %s" % error)
conn.rollback()
return 1
print(f"the dataframe is inserted")
def main(LINKS):
t0 = time.time()
download_raw(LINKS)
execute_values(LST)
t1 = time.time()
print(f"{t1-t0} seconds to download {len(LST)} raw_html.")发布于 2022-01-25 21:00:21
有几个问题。首先,您将发送一个bytes字符串,而不是一个Unicode字符串。第二,你没有做任何引用。第三,您的插入语法是错误的;这些值需要在parens中。第四,您应该允许数据库为您做引用,以防止SQL兵营。
这应该是可行的:
cur.execute("INSERT INTO raw_html VALUES (?)", (L.decode('utf-8'),)然而,你的整个概念是有缺陷的。每个线程都会打开数据库中的一个新连接。太可怕了。在这里,数据库插入不是瓶颈。你应该能按顺序做这件事。只需将commit延迟到整个集合完成。
https://stackoverflow.com/questions/70855559
复制相似问题