Открытие нескольких курсоров в Mysql - дорогостоящая операция с использованием Python? - PullRequest
0 голосов
/ 08 мая 2020

У меня есть несколько таблиц в Mysql, которые должны быть загружены в Teradata, я использую здесь файловый подход. Это означает, что я экспортирую Mysql таблицы в файл разделителя и те файлы, которые я пытаюсь загрузить в терадату. Вопрос / ясность, которых я ожидаю, заключается в том, что мы поддерживаем хранимую процедуру Mysql для извлечения данных из таблиц, эту хранимую процедуру я использую в сценарии python для извлечения данных таблицы. Хорошо / оптимально использовать хранимую процедуру. Поскольку для получения списка таблиц, периода хранения, базы данных и других деталей я создаю один курсор для извлечения данных из одной таблицы, и снова мне нужно создать другой курсор для вызова хранимой процедуры.

  1. Это дорогостоящая операция в mysql создании курсора.
  2. Вместо таблицы для получения списка таблиц, срока хранения, базы данных и других деталей, стоит ли сохранить их в плоском файле.

Пожалуйста, поделитесь своими мыслями.

import sys
import mysql.connector
from mysql.connector import MySQLConnection, Error
import csv

output_file_path='/home/XXXXXXX/'
sys.path.insert(0, '/home/XXXXXXX/')

from mysql_config import *

def stored_proc_call(tbl):


    print('SP call:', tbl)
    conn_sp = mysql.connector.connect(host=dsn,database=database,user=username,passwd=password,allow_local_infile=True)
    conn_sp_cursor = conn_sp.cursor(buffered=True)
    conn_sp_cursor.callproc('mysql_stored_proc', [tbl])

    output_file = output_file_path + tbl + '.txt'
    print('output_file:', output_file)
    with open(output_file, 'w') as filehandle:
         writer = csv.writer(filehandle, delimiter='\x10')
         for result in conn_sp_cursor.stored_results():
             print('Stored proc cursor:{}, value:{}'.format(type(result), result))
             for row in result:
                 writer.writerow(row)
                 #print('cursor row', row)

# Allow loading client-side files using the LOAD DATA LOCAL INFILE statement.
con = mysql.connector.connect(host=dsn,database=database,user=username,passwd=password,allow_local_infile=True)
cursor = con.cursor(buffered=True)

cursor.execute("select * from table")

for row in cursor:
    print('Archive table cursor:{}, value:{}'.format(type(row), row))
    (db,table,col,orgid,*allvalues)=row
    stored_proc_call(table)
    #print('db:{}, table:{}, col:{}, orgid:{}, ret_period:{}, allvalues:{}'.format(db,table,col,orgid,ret_period,allvalues))

#print('db:{}, table:{}, col:{}, orgid:{}, ret_period:{}, allvalues:{}'.format(db,table,col,orgid,ret_period,allvalues))

...