首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用concurrent.futures插入postgres

使用concurrent.futures插入postgres
EN

Stack Overflow用户
提问于 2022-01-25 20:56:24
回答 1查看 104关注 0票数 0

我试图使用多线程将raw_html插入postgres,但无法获得要插入的数据并继续获取

代码语言:javascript
复制
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字符串转换为元组,因为我认为它需要是一个元组,才能接受它。我想不出下一步该做什么来解决这两个问题。任何方向都值得赞赏:

更新:

代码语言:javascript
复制
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.")
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-25 21:00:21

有几个问题。首先,您将发送一个bytes字符串,而不是一个Unicode字符串。第二,你没有做任何引用。第三,您的插入语法是错误的;这些值需要在parens中。第四,您应该允许数据库为您做引用,以防止SQL兵营。

这应该是可行的:

代码语言:javascript
复制
    cur.execute("INSERT INTO raw_html VALUES (?)", (L.decode('utf-8'),)

然而,你的整个概念是有缺陷的。每个线程都会打开数据库中的一个新连接。太可怕了。在这里,数据库插入不是瓶颈。你应该能按顺序做这件事。只需将commit延迟到整个集合完成。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70855559

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档