error line : psycopg2.ProgrammingError: relation "cx3_fidelityinsurance.fresh_us_gmail_1" does not exist
LINE 1: select * from cx3_fidelityinsurance.fresh_us_gmail_1
import psycopg2




class database_admin():

    def __init__(self):
        self.password="pass"
        self.port = "5432"
        self.database = "ass_system"
        self.user = "user"
        self.host = "ip"

    def connect(self):
        ass_lists = psycopg2.connect(user=self.user,password=self.password,host=self.host,port=self.port,database=self.database)
        cursor = ass_lists.cursor()
        return cursor


class database_data():

    def __init__(self):
        self.password="pass"
        self.port = "5432"
        self.database = "ass_lists"
        self.user = "user"
        self.host = "ip"

    def connect(self):
        ass_lists = psycopg2.connect(user=self.user,password=self.password,host=self.host,port=self.port,database=self.database)
        cursor = ass_lists.cursor()
        return cursor


class download_database():

    def __init__(self):
        admin = database_admin()
        self.cursur_lists = admin.connect()
        data = database_data()
        self.cursur_data = data.connect()


    def download_all_lists(self):
        query_list = "select * from admin.data_lists"
        self.cursur_lists.execute(query_list)
        rows = self.cursur_lists.fetchall() 
        for row in rows:
            query_list = "select * from "+ row[1]
            self.cursur_data.execute(query_list)
            rows_data = self.cursur_data.fetchall() 
            for row_data in rows_data:
                print(row[1])
                f=open(row[1],'a+')
                f.write(row_data[1]+'\n')
                f.close()

def main():
    data =download_database()
    data.download_all_lists()


if __name__ == '__main__':
    main()
0
Morad Semmar 10 Окт 2019 в 11:33
Вы уверены, что это код, вызывающий эту ошибку? Поскольку fresh_us_gmail_1 швы никогда не должны использоваться .. Но я предполагаю, что fresh_us_gmail_1 определен как данные таблицы в admin.data_lists?
 – 
Raymond Nijland
10 Окт 2019 в 11:52
Да, я думаю, потому что эта shema.table пуста, на cx3_fidelityinsurance нет fresh_us_gmail_1
 – 
Morad Semmar
10 Окт 2019 в 11:55

2 ответа

Эта часть вашего кода подвержена внедрению запросов, вы не должны делать подобные запросы в формате RAW SQL

def download_all_lists(self):
    query_list = "select * from admin.data_lists"#never do this...sql injection
    self.cursur_lists.execute(query_list)
    rows = self.cursur_lists.fetchall() 
    for row in rows:
        query_list = "select * from "+ row[1]#never do this...sql injection
        self.cursur_data.execute(query_list)
        rows_data = self.cursur_data.fetchall() 
        for row_data in rows_data:
            print(row[1])#you can print row[1] once 
            f=open(row[1],'a+')#this is bad...don't need to open row[1] here
            f.write(row_data[1]+'\n')
            f.close()

Но выполняйте SQL-запросы как в следующем коде [см. модификации]

def download_all_lists(self):
    tb_cl = sql.Identifier('admin.data_lists')
    self.cursur_lists.execute('SELECT * FROM %s'%tb_cl)
    rows = self.cursur_lists.fetchall() 
    for row in rows:
        tb_cl=sql.Identifier(row[1])
        self.cursur_data.execute('SELECT * FROM %s'%tb_cl)
        rows_data = self.cursur_data.fetchall() 
        print(row[1])
        with open(row[1], 'a+') as f:#with will take care of closing f when leaving it
            for row_data in rows_data:
                f.write(row_data[1]+'\n')

Что касается вашей ошибки, некоторые имена столбцов не определены в схеме (может также таблица). глобально проверь всю свою схему

0
user1438644 10 Окт 2019 в 12:31
Это нормально именно в этом контексте, но делать это таким образом - плохая идея.
 – 
user1438644
10 Окт 2019 в 12:06
Вам нужно сделать что-то вроде использования format(sql.Identifier('...'), например объясняет на второй запрос, поскольку query_list = "select * from admin.data_lists" безопасен, он не является SQL-инъекционным, поскольку оператор SQL не создается динамически из ненадежных источников данных.
 – 
Raymond Nijland
10 Окт 2019 в 12:11
Мы делаем невозможно, но скрипт загружает только 39 файлов, он должен загрузить 3800 файлов
 – 
Morad Semmar
10 Окт 2019 в 18:40

Импорт psycopg2

Класс database_admin ():

def __init__(self):
    self.password="pass"
    self.port = "5432"
    self.database = "ass_system"
    self.user = "user"
    self.host = "ip"

def connect(self):
    ass_lists = psycopg2.connect(user=self.user,password=self.password,host=self.host,port=self.port,database=self.database)
    cursor = ass_lists.cursor()
    return cursor

Класс database_data ():

def __init__(self):
    self.password="pass"
    self.port = "5432"
    self.database = "ass_lists"
    self.user = "user"
    self.host = "ip"

def connect(self):
    ass_lists = psycopg2.connect(user=self.user,password=self.password,host=self.host,port=self.port,database=self.database)
    cursor = ass_lists.cursor()
    return cursor

Класс download_database ():

def __init__(self):
    admin = database_admin()
    self.cursur_lists = admin.connect()
    data = database_data()
    self.cursur_data = data.connect()


def download_all_lists(self):
    query_list = "select * from admin.data_lists"
    self.cursur_lists.execute(query_list)
    rows = self.cursur_lists.fetchall() 
    for row in rows:
        query_list = "select * from "+ row[1]
        try:
            self.cursur_data.execute(query_list)
            rows_data = self.cursur_data.fetchall() 
            for row_data in rows_data:
                print(row[1])
                f=open(row[1],'a+')
                f.write(row_data[1]+'\n')
                f.close()
        except:
            print("skip~")

Def main ():

data =download_database()
data.download_all_lists()

Если name == ' main ': основной()

0
Morad Semmar 10 Окт 2019 в 12:39