在 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()
我正在尝试使用 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()