在 Python 中使用 psycopg2 创建 PostgresQL table

Creating a PostgresSQL table using psycopg2 in Python

我正在尝试使用 Python 中的 psycopg2 库连接到远程 PostgresSQL 数据库。需要说明的是,我已经可以使用 psql.exe 来执行此操作,但这不是我想要在此处执行的操作。到目前为止,我已经验证我可以连接并使用我的光标对现有 table:

执行简单查询
 import psycopg2
 
 conn = psycopg2.connect(dbname='mydb', user='postgres', password='mypassword', host='www.mydbserver.com', port='5432', sslmode='require')
 cur = conn.cursor()
 cur.execute('SELECT * FROM existing_schema.existing_table')
 one = cur.fetchone()
 print(one)

这本质上是连接到现有架构和 table 并选择所有内容。然后我从 cur 中获取第一行并打印它。示例输出:('090010100001', '09001', None, 'NO', None, 'NO')。现在,我想使用相同的方法创建一个新的 table。我已经在 mydb 中创建了一个名为 test 的新模式。我的计划是将 csv 数据复制到 table 字母,但现在,我只想创建空白 table。这是我尝试过的:

 cur.execute("""
    CREATE TABLE test.new_table
    (
        region TEXT,
        state TEXT,
        tier TEXT,
        v_detailed DOUBLE PRECISION,
        v_approx DOUBLE PRECISION,
        v_unmapped DOUBLE PRECISION,
        v_total DOUBLE PRECISION,
        a_detailed DOUBLE PRECISION,
        a_approx DOUBLE PRECISION,
        a_unmapped DOUBLE PRECISION,
        a_total DOUBLE PRECISION
    )
""")
conn.commit()

当我在 Jupyter Notebook 中 运行 以上内容时,我认为这将是一个相当快的过程。但是,它似乎卡住了,只有 运行 和 运行(该过程在 30 + 分钟后没有完成)。最终,它抛出了一个错误:OperationalError: server closed the connection unexpectedly. This probably means the server terminated abnormally before or while processing the request. 这么简单的代码行 运行 应该花那么长时间吗?! (我猜,不)。我可能在这里做错了什么?

好的,在 psycopg2 中使用 .copy_from() 方法存在问题。这就是问题所在。这就是我克服它的方法:

 conn = psycopg2.connect(dbname='mydb', user='postgres', password='mypassword', host='www.mydbserver.com', port='5432', sslmode='require')
 cur = conn.cursor()
cur.execute("""
CREATE TABLE test.new_table
(
    region TEXT,
    state TEXT,
    tier TEXT,
    v_detailed DOUBLE PRECISION,
    v_approx DOUBLE PRECISION,
    v_unmapped DOUBLE PRECISION,
    v_total DOUBLE PRECISION,
    a_detailed DOUBLE PRECISION,
    a_approx DOUBLE PRECISION,
    a_unmapped DOUBLE PRECISION,
    a_total DOUBLE PRECISION
    )
""")
conn.commit()

with open(output_file, 'r') as f:
    next(f) # Skip the header row.
    #You must set the search_path to the desired schema beforehand
    cur.execute('SET search_path TO test, public')
    tbl = 'region_report_%s'% (report_type)
    cur.copy_from(f, tbl, sep=',')

conn.commit()

conn.close()