Ошибка при сохранении инструкции select psql в файл csv на python

#python #csv

#python #csv

Вопрос:

Я пытаюсь сохранить свой запрос select в CSV-файл с помощью python, но получаю сообщение об ошибке ниже. Я подключаюсь к серверу postgres и запускаю запрос выбора, а затем сохраняю результирующий набор в файл csv с именем resultsfile_yyyy/mm / dd.csv .

 Traceback (most recent call last):
  File "d:testscampaigns.py", line 37, in <module>
    cur.copy_expert(outputquery, f)
psycopg2.errors.SyntaxError: syntax error at or near ")"
LINE 24: ) TO STDOUT WITH CSV HEADER
  

ниже приведен мой код :

 import sys
from datetime import datetime
#set up psycopg2 environment
import psycopg2
#driving_distance module
#note the lack of trailing semi-colon in the query string, as per the Postgres documentation
query = """
    WITH LOANS AS (SELECT SUBSCRIBER_FK, LOAN_ID, (CENTS_LOANED - CENTS_SERVICEQ) AS LEND_AMOUNT

          FROM   TBL_LOANS
          WHERE  (LOAN_TIME BETWEEN (CURRENT_DATE - 21) AND CURRENT_DATE - INTERVAL '1 SECOND')
          --test clause
          limit 100
         ),
REPAY AS (SELECT LOAN_FK, SUM(CENTS_PRINCIPAL) AS CENTS_PRINCIPAL
          FROM   TBL_LOANS_REPAY
          WHERE  (EVENT_TIME BETWEEN (CURRENT_DATE - 21) AND CURRENT_DATE - INTERVAL '1 SECOND')
          GROUP BY LOAN_FK
          --test clause
          limit 100
         )
SELECT (237000000000   SUBSCRIBER_FK) AS MSISDN,
(SUM(LEND_AMOUNT) - SUM(COALESCE(CENTS_PRINCIPAL, 0))   100) AS DEBT_AMOUNT_PLUS_100
FROM REPAY AS R
RIGHT
JOIN LOANS AS L ON (L.LOAN_ID = R.LOAN_FK)
GROUP BY (237000000000   SUBSCRIBER_FK)
ORDER BY DEBT_AMOUNT_PLUS_100 desc 
    )
"""
#make connection between python and postgresql
conn = psycopg2.connect(host="10.66.54.200", user="mdsa_superuser", password="mdsa_superuser", dbname="mdh_cm", port="37821" )
cur = conn.cursor()
outputquery = "COPY ({0}) TO STDOUT WITH CSV HEADER".format(query)
datetoday=datetime.today().strftime('%Y-%m-%d')
with open('resultsfile_' datetoday '.csv', 'w') as f:
    cur.copy_expert(outputquery, f)

conn.close()
  

Ответ №1:

Удалите «)» в

 query = """
WITH LOANS AS (SELECT SUBSCRIBER_FK, LOAN_ID, (CENTS_LOANED - CENTS_SERVICEQ) AS LEND_AMOUNT

      FROM   TBL_LOANS
      WHERE  (LOAN_TIME BETWEEN (CURRENT_DATE - 21) AND CURRENT_DATE - INTERVAL '1 SECOND')
      --test clause
      limit 100
     ),
  

ПОГАСИТЬ КАК (ВЫБЕРИТЕ LOAN_FK, SUM(CENTS_PRINCIPAL) КАК CENTS_PRINCIPAL
ИЗ TBL_LOANS_REPAY
ГДЕ (ВРЕМЯ СОБЫТИЯ МЕЖДУ (CURRENT_DATE — 21) И CURRENT_DATE — ИНТЕРВАЛ ‘1 СЕКУНДА’)
ГРУППА ПО LOAN_FK

ограничение тестового предложения 100
)
ВЫБЕРИТЕ (237000000000 SUBSCRIBER_FK) КАК MSISDN,
(SUM(LEND_AMOUNT) — SUM(ОБЪЕДИНИТЬ (CENTS_PRINCIPAL, 0)) 100) КАК DEBT_AMOUNT_PLUS_100
ИЗ REPAY КАК R
ПРАВИЛЬНО
ПРИСОЕДИНИТЕ LOANS КАК L ON (L.LOAN_ID = R.LOAN_FK)
ГРУППА ПО (237000000000 SUBSCRIBER_FK)
ПОРЯДОК ПО DEBT_AMOUNT_PLUS_100 desc
)##Удалить это
«»»

Ответ №2:

Замените ваш запрос на это

 WITH LOANS AS (SELECT SUBSCRIBER_FK, LOAN_ID, (CENTS_LOANED - CENTS_SERVICEQ) AS LEND_AMOUNT FROM   TBL_LOANS WHERE  (LOAN_TIME BETWEEN (CURRENT_DATE - 21) AND CURRENT_DATE - INTERVAL '1 SECOND')
          --test clause
          limit 100
         ),
REPAY AS (SELECT LOAN_FK, SUM(CENTS_PRINCIPAL) AS CENTS_PRINCIPAL
          FROM   TBL_LOANS_REPAY
          WHERE  (EVENT_TIME BETWEEN (CURRENT_DATE - 21) AND CURRENT_DATE - INTERVAL '1 SECOND')
          GROUP BY LOAN_FK
          --test clause
          limit 100
         )
SELECT (237000000000   SUBSCRIBER_FK) AS MSISDN,
(SUM(LEND_AMOUNT) - SUM(COALESCE(CENTS_PRINCIPAL, 0))   100) AS DEBT_AMOUNT_PLUS_100
FROM REPAY AS R
RIGHT JOIN LOANS AS L ON (L.LOAN_ID = R.LOAN_FK)
GROUP BY 1
ORDER BY 2 desc