Запуск динамического запроса из Python с вводом из CSV - PullRequest
2 голосов
/ 13 апреля 2019

У меня есть CSV-файл с именами таблиц и первичными ключами для этих таблиц в следующем формате:

|  Table Name  |  Primary Key  | 
|    Table 1   |     Col1      |  
|    Table 1   |     Col2      |
|    Table 1   |     Col3      | 
|    Table 2   |     Col11     | 
|    Table 2   |     Col12     | 

Я хочу запустить SQL-запрос для проверки ограничения PK для каждой таблицы. Запрос для этого будет выглядеть так:

select Col1, Col2, Col3 from Table1
group by Col1, Col2, Col3
having count(*)>1 

Но у меня есть тысячи таблиц в этом файле. Как мне написать и выполнить этот запрос динамически и записать результаты в плоский файл? Я хочу выполнить это с помощью Python 3.

Попытка:

CSV:

enter image description here

Мой PKTest.py

def getColumns(filename):
    tables = {}

    with open(filename) as f:
        for line in f:
            line = line.strip()
            if 'Primary Key' in line:
                continue

            cols = line.split('|')
            table = cols[1].strip()
            col = cols[2].strip()

            if table in tables:
                tables[table].append(col)
            else:
                tables[table] = [col]
    return tables

def runSQL(table, columns):
    statement = 'select {0} from {1} group by {0} having count(*) > 1'.format(', '.join(columns), table.replace(' ',''))
    return statement

if __name__ == '__main__':
    tables = getColumuns('PKTest.csv')
    try:
        #cursor to connect

        for table in tables:
            sql = runSQL(table,tables[table])
            print(sql)
            cursor.execute(sql)
            for result in cursor:
                print(result)

    finally:
        cursor.close()
    ctx.close()

1 Ответ

1 голос
/ 13 апреля 2019

Вам придется немного импровизировать в этом ответе, поскольку у меня нет доступа к Oracle.

Предположим, есть файл с именем so.csv, который содержит данные, показанные в вашем вопросе.

Создайте файл с именем so.py примерно так. Я добавлю кусочки кода и некоторые пояснения. Вы можете собрать файл вместе или скопировать / вставить его отсюда: https://rextester.com/JLQ73751.

В верхней части файла импортируйте свою зависимость от Oracle:

# import cx_Oracle
# https://www.oracle.com/technetwork/articles/dsl/python-091105.html

Затем создайте функцию, которая анализирует ваш so.csv и помещает таблицу и столбцы в словарь следующим образом: {'Table 1': ['Col1', 'Col2', 'Col3'], 'Table 2': ['Col11', 'Col12']}

def get_tables_columns(filename):

    tables = {}

    with open(filename) as f:
        for line in f:
            line = line.strip()
            if 'Primary Key' in line:
                continue

            cols = line.split('|')

            table = cols[1].strip()
            col = cols[2].strip()

            if table in tables:
                tables[table].append(col)
            else:
                tables[table] = [col]

    return tables

Затем создайте функцию, которая генерирует sql, если ей известны таблица и список столбцов:

def get_sql(table, columns):

    statement = 'select {0} from {1} group by {0} having count(*) > 1'.format(
            ', '.join(columns),
            table.replace(' ', '')
        )

    return statement

Пора выполнять функции:

if __name__ == '__main__':
    tables = get_tables_columns('so.csv')

    # here goes your code to connect with Oracle
    # con = cx_Oracle.connect('pythonhol/welcome@127.0.0.1/orcl')
    # cur = con.cursor()

    for table in tables:
        sql = get_sql(table, tables[table])
        print(sql)

        # here goes your sql statement execution            
        # cur.execute(sql)
        # for result in cur:
        #    print result

    # close your Oracle connection
    # con.close()

Вы можете включить свои операторы, связанные с Oracle, и запустить файл python.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...