嘗試將數據從 CSV 文件複製到 PostgreSQL 數據庫時,SQL 語句上的 Psycopg2 錯誤
我不是開發人員或 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想要什麼。
如果使用 python 將數據複製到 postgresql,最快和穩定的方法是通過 pandas。
這是他們文件中的標準。這是步驟。
- pandas 將 read_csv 讀取到數據框
- 以特殊方法將數據幀傳輸到 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
希望它會幫助你。