Чтение и скрипт postgres с использованием python

У меня есть таблицы postgres, и я хочу запустить файл сценария PostgreSQL в этих таблицах с помощью python, а затем написать результат запросов в файле csv. Файл сценария имеет несколько запросов, разделенных точкой с запятой ; , Пример сценария показан ниже

Файл сценария:

 --Duplication Check select p.*, c.name from scale_polygons_v3 c inner join cartographic_v3 p on (metaphone(c.name_displ, 20) LIKE metaphone(p.name, 20)) AND c.kind NOT IN (9,10) where ST_Contains(c.geom, p.geom); --Area Check select sp.areaid,sp.name_displ,p.road_id,p.name from scale_polygons_v3 sp, pak_roads_20162207 p where st_contains(sp.geom,p.geom) and sp.kind = 1 and p.areaid != sp.areaid; 

Когда я запускаю код python, он выполняется успешно без какой-либо ошибки, но проблема, с которой я столкнулся, заключается в том, что при записи результата запросов в файл csv. Только результат последнего выполненного запроса записывается в файл csv. Это означает, что первый результат запроса перезаписывается вторым запросом, вторым – третьим и т. Д. До последнего запроса.

Вот мой код python:

 import psycopg2 import sys import csv import datetime, time def run_sql_file(filename, connection): ''' The function takes a filename and a connection as input and will run the SQL query on the given connection ''' start = time.time() file = open(filename, 'r') sql = s = " ".join(file.readlines()) #sql = sql1[3:] print "Start executing: " + " at " + str(datetime.datetime.now().strftime("%Y-%m-%d %H:%M")) + "\n" print "Query:\n", sql + "\n" cursor = connection.cursor() cursor.execute(sql) records = cursor.fetchall() with open('Report.csv', 'a') as f: writer = csv.writer(f, delimiter=',') for row in records: writer.writerow(row) connection.commit() end = time.time() row_count = sum(1 for row in records) print "Done Executing:", filename print "Number of rows returned:", row_count print "Time elapsed to run the query:",str((end - start)*1000) + ' ms' print "\t ===============================" def main(): connection = psycopg2.connect("host='localhost' dbname='central' user='postgres' password='tpltrakker'") run_sql_file("script.sql", connection) connection.close() if __name__ == "__main__": main() 

Что не так с моим кодом?

2 Solutions collect form web for “Чтение и скрипт postgres с использованием python”

Если вы можете немного изменить SQL-скрипт, то вот обходной путь:

 #!/usr/bin/env python import psycopg2 script = ''' declare cur1 cursor for select * from (values(1,2),(3,4)) as t(x,y); declare cur2 cursor for select 'a','b','c'; ''' print script conn = psycopg2.connect(''); # Cursors exists and available only inside the transaction conn.autocommit = False; # Create cursors from script conn.cursor().execute(script); # Read names of cursors cursors = conn.cursor(); cursors.execute('select name from pg_cursors;') cur_names = cursors.fetchall() # Read data from each available cursor for cname in cur_names: print cname[0] cur = conn.cursor() cur.execute('fetch all from ' + cname[0]) rows = cur.fetchall() # Here you can save the data to the file print rows conn.rollback() print 'done' 

Отказ от ответственности: я полностью новичок с Python.

Это самый простой вывод каждого запроса в виде другого файла. copy_expert

 query = ''' select p.*, c.name from scale_polygons_v3 c inner join cartographic_v3 p on metaphone(c.name_displ, 20) LIKE metaphone(p.name, 20) and c.kind not in (9,10) where ST_Contains(c.geom, p.geom) ''' copy = "copy ({}) to stdout (format csv)".format(query) f = open('Report.csv', 'wb') cursor.copy_expert(copy, f, size=8192) f.close() query = ''' select sp.areaid,sp.name_displ,p.road_id,p.name from scale_polygons_v3 sp, pak_roads_20162207 p where st_contains(sp.geom,p.geom) and sp.kind = 1 and p.areaid != sp.areaid; ''' copy = "copy ({}) to stdout (format csv)".format(query) f = open('Report2.csv', 'wb') cursor.copy_expert(copy, f, size=8192) f.close() 

Если вы хотите добавить второй вывод в тот же файл, просто сохраните первый файл.

Обратите внимание, что необходимо, чтобы copy copy_expert на stdout чтобы сделать его доступным для copy_expert

  • Как я могу запросить ближайшую запись в заданных координатах (широта и долгота типа строки)?
  • Django, Postgres - колонка не может быть автоматически добавлена ​​для ввода целого числа
  • Не удается подключиться к psycopg2, но может быть через командную строку
  • Ошибка при запуске «python manage.py syncdb» локально, но без ошибок при выполнении той же команды через Heroku
  • Django ConnectionAbortedError: Установленное соединение было прервано программным обеспечением вашей главной машины
  • Никаких изменений не обнаружено, когда я запускаю pyhon manage.py makemigrations и migrate
  • SqlAlchemy: получение идентификатора последней записи
  • Как использовать bindparam () в пользовательском выражении Compiled?
  • Как хранить файлы в поле массива djangos
  • Как ускорить операции обновления / замены в PostgreSQL?
  • Передача списка параметров в SQL в psycopg2
  • Python - лучший язык программирования в мире.