Использование Python для запроса 100+ баз данных SQL на разных серверах - PullRequest
0 голосов
/ 26 сентября 2018

Я новичок в Python и работаю в среде с большим количеством баз данных, которые имеют схожую структуру таблиц.Моя цель - создать через Python сценарии, которые могут запускать сценарии SQL для большого количества баз данных.Сейчас у меня есть простой сценарий, но он не масштабируется.Можно ли получить pyodbc для чтения из таблицы Excel, в которой содержатся данные о моем соединении с базой данных, и выполнить мой SQL-запрос для всех более 100 из них?

Ниже приведен пример сценария, который я запускаю.Как вы видите, я должен создать новые строки cursor.execute для каждой базы данных

import csv
import pyodbc

conn1 = pyodbc.connect('Driver={ODBC Driver 13 for SQL Server};Server=SERVER;Database=Database;UID=user')
conn2 = pyodbc.connect('Driver={ODBC Driver 13 for SQL Server};Server=SERVER;Database=Database;UID=user')
conn3 = pyodbc.connect('Driver={ODBC Driver 13 for SQL Server};Server=SERVER;Database=Database;UID=user')

cursor1 = conn1.cursor()
cursor2 = conn2.cursor()
cursor3 = conn3.cursor()

sql = "SELECT * FROM Users"

sql2 = "SELECT * FROM Computers"

sql3 = "SELECT * FROM Offices"


rows = cursor1.execute(sql)
with open(r'C:\Users\xxx\PycharmProjects\RemoteSQLTest\Test\Database1\Database1\users.csv.', 'w', newline='') as csvfile:
    writer = csv.writer(csvfile)
    writer.writerow([x[0] for x in cursor1.description])
    for row in rows:
        writer.writerow(row)

rows = cursor1.execute(sql2)
with open(r'C:\Users\xxx\PycharmProjects\RemoteSQLTest\Test\Database1\Database1\Computers.csv.', 'w', newline='') as csvfile:
    writer = csv.writer(csvfile)
    writer.writerow([x[0] for x in cursor1.description])
    for row in rows:
        writer.writerow(row)

rows = cursor1.execute(sql3)
with open(r'C:\Users\xxx\PycharmProjects\RemoteSQLTest\Test\Database1\Database1\Offices.csv.', 'w', newline='') as csvfile:
    writer = csv.writer(csvfile)
    writer.writerow([x[0] for x in cursor1.description])
    for row in rows:
        writer.writerow(row)

rows = cursor2.execute(sql)
with open(r'C:\Users\xxx\PycharmProjects\RemoteSQLTest\Test\Database2\Database2\users.csv.', 'w', newline='') as csvfile:
    writer = csv.writer(csvfile)
    writer.writerow([x[0] for x in cursor2.description])
    for row in rows:
        writer.writerow(row)

rows = cursor2.execute(sql2)
with open(r'C:\Users\xxx\PycharmProjects\RemoteSQLTest\Test\Database2\Database2\Computers.csv.', 'w', newline='') as csvfile:
    writer = csv.writer(csvfile)
    writer.writerow([x[0] for x in cursor2.description])
    for row in rows:
        writer.writerow(row)

rows = cursor2.execute(sql3)
with open(r'C:\Users\xxx\PycharmProjects\RemoteSQLTest\Test\Database2\Database2\Offices.csv.', 'w', newline='') as csvfile:
    writer = csv.writer(csvfile)
    writer.writerow([x[0] for x in cursor2.description])
    for row in rows:
        writer.writerow(row)

rows = cursor3.execute(sql)
with open(r'C:\Users\xxx\PycharmProjects\RemoteSQLTest\Test\Database3\users.csv.', 'w', newline='') as csvfile:
    writer = csv.writer(csvfile)
    writer.writerow([x[0] for x in cursor3.description])
    for row in rows:
        writer.writerow(row)

rows = cursor3.execute(sql2)
with open(r'C:\Users\xxx\PycharmProjects\RemoteSQLTest\Test\Database3\Computers.csv.', 'w', newline='') as csvfile:
    writer = csv.writer(csvfile)
    writer.writerow([x[0] for x in cursor3.description])
    for row in rows:
        writer.writerow(row)

rows = cursor3.execute(sql3)
with open(r'C:\Users\xxx\PycharmProjects\RemoteSQLTest\Test\Database3\Offices.csv.', 'w', newline='') as csvfile:
    writer = csv.writer(csvfile)
    writer.writerow([x[0] for x in cursor3.description])
    for row in rows:
        writer.writerow(row)

conn1.close()
conn2.close()
conn3.close()

    enter code here

1 Ответ

0 голосов
/ 26 сентября 2018

Вы можете использовать некоторые циклы и форматирование строк, чтобы избежать повторяющегося кода.Для документа Excel с одним листом с именем Sheet1 ", содержащим

            A
  +--------------------
1 | server
2 | localhost,49242
3 | 192.168.0.179,49242

, этот код

import pyodbc

tables = ['Users', 'Computers', 'Offices']

cnxn_Excel = pyodbc.connect(
    r'DRIVER={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};'
    r'DBQ=C:\Users\Gord\Desktop\servers.xlsx;',
    autocommit=True
)
crsr_Excel = cnxn_Excel.execute("SELECT server FROM [Sheet1$]")

cnxn_string_SQL_template = (
    'DRIVER=ODBC Driver 17 for SQL Server;'
    'SERVER={};'
    'DATABASE=myDb;'
    'Trusted_Connection=yes;'
)
for row_Excel in crsr_Excel:
    server_name = row_Excel.server
    print(f'Server: {server_name}')
    cnxn_string_SQL = cnxn_string_SQL_template.format(server_name)
    print(f'   DEBUG_INFO: {cnxn_string_SQL}')
    cnxn_SQL = pyodbc.connect(cnxn_string_SQL)
    for table in tables:
        print(f'   Table: {table}')
        sql = f'SELECT * FROM [{table}]'
        print(f'      DEBUG_INFO: {sql}')
        crsr_SQL = cnxn_SQL.execute(sql)
        #
        # ... code to dump crsr_SQL to csv file goes here
        #
        crsr_SQL.close()
    cnxn_SQL.close()
crsr_Excel.close()
cnxn_Excel.close()

производит следующий вывод на консоль:

Server: localhost,49242
   DEBUG_INFO: DRIVER=ODBC Driver 17 for SQL Server;SERVER=localhost,49242;DATABASE=myDb;Trusted_Connection=yes;
   Table: Users
      DEBUG_INFO: SELECT * FROM [Users]
   Table: Computers
      DEBUG_INFO: SELECT * FROM [Computers]
   Table: Offices
      DEBUG_INFO: SELECT * FROM [Offices]
Server: 192.168.0.179,49242
   DEBUG_INFO: DRIVER=ODBC Driver 17 for SQL Server;SERVER=192.168.0.179,49242;DATABASE=myDb;Trusted_Connection=yes;
   Table: Users
      DEBUG_INFO: SELECT * FROM [Users]
   Table: Computers
      DEBUG_INFO: SELECT * FROM [Computers]
   Table: Offices
      DEBUG_INFO: SELECT * FROM [Offices]
...