使用CSV输入从Python运行动态查询

时间:2019-04-13 01:20:20

标签: python sql python-3.x oracle

我有一个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 个答案:

答案 0 :(得分:1)

由于我没有使用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文件。