Postgresql

嘗試將數據從 CSV 文件複製到 PostgreSQL 數據庫時,SQL 語句上的 Psycopg2 錯誤

  • March 8, 2022

我不是開發人員或 PostgreSQL 數據庫管理員,所以這可能是基本問題。

後勤:Windows 10 server / pgAdmin 4 / Postgres 10 / Python 2.7.13

我正在使用 python 腳本來獲取外部數據,創建一個 CSV 文件並將其複製到 Postgres 10。我不斷收到以下錯誤: Psycopg2.ProgrammingError: syntax error at or near “VALUES”

我有一個兩部分的問題 - 1)我在以下 sql 語句中看不到語法錯誤

def insert_csv_data(sqlstmt):
with get_conn('pg') as db:
   cur = db.cursor()
   sqlcopy = "COPY irwin (fire_id,name,type,acres,date_time,state,county,admin_unit,land_cat,commander,perc_cntnd,cont_date,gacc,lat,long,geom,updated,imo) VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,ST_SetSRID(ST_MakePoint(%s, %s),4326)%s,%s) FROM STIN DELIMITER ',' CSV HEADER"

   with open(csv_file, 'r') as f:
       #next(f)# Skipping the first line header row
       cur.copy_expert(sqlcopy, f, size=8000)
       db.commit()
       cur.close()

並且 2) 一旦解決了這個問題,我希望得到關於 postgres 中幾何列的錯誤。如果有人也可以偷看程式碼片段並讓我知道是否有任何東西跳出來,我會非常感激!

此程式碼段按順序提取外部數據,但我認為我沒有正確編碼以將緯度/經度拉入 geom 欄位。

           # Lat 15 - double
       if not attributes['InitialLatitude'] is None:
           lat = str(attributes['InitialLatitude']).replace('\n', '')
       else:
           lat = '0'

       #Long 16 - double
       if not attributes['InitialLongitude'] is None:
           long = str(attributes['InitialLongitude']).replace('\n', '')
       else:
           long = '0'

       # geom is not defined - script is dumping the geometry into the IMO field
       geom = str(attributes['InitialLatitude']) + ' ' + str(attributes['InitialLongitude'])

我在 csv 數據中添加了一個 Geom 標頭。請幫忙 - 謝謝!

sqlcopy = "COPY irwin (fire_id,name,type,acres,date_time,state,county,admin_unit,land_cat,commander,perc_cntnd,cont_date,gacc,lat,long,geom,updated,imo)  FROM STDIN WITH FORMAT CSV, HEADER")

複製不行values...,輸入中的列必須為您列出的列正確格式化,format CSV通常也是比delimiter ','

複製專家實際上所做的是為 postgresql 複製命令打開一個通道。然後通過該通道噴射文件內容。所以你需要格式化查詢postgres想要什麼。

https://www.postgresql.org/docs/10/sql-copy.html

如果使用 python 將數據複製到 postgresql,最快和穩定的方法是通過 pandas。

這是他們文件中的標準。這是步驟。

  1. pandas 將 read_csv 讀取到數據框
  2. 以特殊方法將數據幀傳輸到 postgresql 以加快速度。

pg高速插入方法供您參考:

支持 COPY FROM 的數據庫的替代 to_sql()方法

從 io 導入 csv 導入 StringIO

def psql_insert_copy(table, conn, keys, data_iter): """ 執行插入數據的SQL語句

Parameters
----------
table : pandas.io.sql.SQLTable
conn : sqlalchemy.engine.Engine or sqlalchemy.engine.Connection
keys : list of str
   Column names
data_iter : Iterable that iterates the values to be inserted
"""
# gets a DBAPI connection that can provide a cursor
dbapi_conn = conn.connection
with dbapi_conn.cursor() as cur:
   s_buf = StringIO()
   writer = csv.writer(s_buf)
   writer.writerows(data_iter)
   s_buf.seek(0)

   columns = ', '.join('"{}"'.format(k) for k in keys)
   if table.schema:
       table_name = '{}.{}'.format(table.schema, table.name)
   else:
       table_name = table.name

   sql = 'COPY {} ({}) FROM STDIN WITH CSV'.format(
       table_name, columns)
   cur.copy_expert(sql=sql, file=s_buf)

https://pandas.pydata.org/pandas-docs/stable/user_guide/io.html#sql-queries

希望它會幫助你。

引用自:https://dba.stackexchange.com/questions/240224