Automatyzacja procesów backendowych w Twojej instancji SQL Server to typowe zadanie. Niezależnie od tego, czy jest to odświeżanie statystyk, przebudowywanie indeksów, odczytywanie czy usuwanie danych, integracja innych struktur programistycznych z systemem RDBMS jest niezwykle cenna. W tym artykule omówimy te typy zadań, które są specjalnie zintegrowane z Pythonem.
Nie będziemy skupiać się na tak fundamentalnych pytaniach jak:czym jest SQL i Python, jak i gdzie ich używamy. Zamiast tego zbadamy konkretne przypadki, które wymagają połączenia SQL i Pythona oraz różnych dostępnych modułów metod.
Ciąg połączenia serwera SQL
Zanim zaczniemy badać przypadek połączenia Pythona z serwerem SQL, zapoznajmy się z podstawami.
Parametry połączenia reprezentują wymagane fragmenty danych, które wskazują i uwierzytelniają wystąpienie bazy danych. Mogą istnieć drobne niuanse dla każdego typu instancji bazy danych, ale ogólnie wymagane informacje to nazwa serwera, sterownik bazy danych, nazwa użytkownika, hasło i numer portu.
Szczegóły instancji serwera SQL
Szczegóły tych parametrów połączenia będą takie same, jak w przypadku łączenia się przez SSMS z instancją bazy danych. Zanotuj instancję bazy danych {SERVER}\{INSTANCE} format – tutaj jest DESKTOP-6L1B155\FogelDev . Możliwe jest również połączenie z nazwą serwera, jeśli masz uruchomioną tylko jedną domyślną instancję.
Kod tworzenia bazy danych i tabel SQL Server
Po pierwsze, potrzebujemy bazy danych o strukturze tabeli wymaganej do pracy z Pythonem i SQL Server. Poniższy skrypt utworzy taką bazę danych i jedną w niej tabelę. Ta tabela posłuży nam jako obszar demonstracyjny, aby zobaczyć, jak używać razem SQL i Pythona.
CREATE DATABASE CODESIGHT_DEMOS;
USE CODESIGHT_DEMOS;
CREATE TABLE POSTS
(
ID INT IDENTITY(1,1) PRIMARY KEY,
NAME VARCHAR(200),
Author VARCHAR(100),
URL VARCHAR(100),
DATE DATE
)
INSERT INTO POSTS
VALUES('Properly Dealing with Encryption of Databases in an AlwaysOn Availability Group Scenario','Alejandro Cobar','https://codingsight.com/encryption-of-databases-in-alwayson-availability-group-scenario/','4/23/2021')
INSERT INTO POSTS
VALUES('An Overview of DataFrames in Python','Aveek Das','https://codingsight.com/an-overview-of-dataframes-in-python/','4/23/2021')
INSERT INTO POSTS
VALUES('SQL Server Business Intelligence (BI) – Traditional Tools and Technologies','Haroon Ashraf','https://codingsight.com/sql-server-business-intelligence-bi-tools-and-technologies/','4/19/2021')
Moduły Pythona
Naszym celem jest teraz zdefiniowanie sposobu połączenia Pythona z instancjami serwera SQL. Do wykonania tego zadania dostępnych jest wiele modułów Pythona, a dwa z nich są podstawowe. Zamierzamy zająć się PYODC i SQLAlchemy . Te moduły obsługują część operacji związanych z połączeniem.
Do wczytania danych z tabel SQL Server do pamięci wymagany jest dodatkowy kod. To tutaj Pandy wchodzi biblioteka.
Pandy może być ściśle zintegrowany z SQLALchemy aby wczytać dane bezpośrednio do DataFrame obiekty (w pamięci masowej opartej na tablicy pamięci, która może działać błyskawicznie i wyglądać jak tabele bazy danych).
Rzućmy okiem na kilka przykładów parametrów połączenia.
Pierwszy przykład wykorzystuje SQL Server i instancję z poprzedniego zrzutu ekranu. Możesz ustawić te zmienne w swoich konkretnych danych, aby nawiązać połączenie.
Należy również zauważyć, że to konkretne połączenie korzysta z uwierzytelniania systemu Windows. Dlatego spróbuje uwierzytelnić się jako użytkownik z mojego komputera z systemem Windows, na którym jestem zalogowany. Jeśli nie określono nazwy użytkownika i hasła, jest to domyślne zachowanie w ciągu połączenia.
- Nazwa serwera =„DESKTOP-6L1B155”
- Nazwa instancji =„FogelDev”
- Nazwa bazy danych =„CODESIGHT_DEMOS”
- Numer portu =„1433”
print("mssql+pyodbc://@{SERVER}:{PORT}\\{INSTANCE}/{DATABASE}?driver=SQL+Server+Native+Client+11.0".format(SERVER = Servername, INSTANCE = Instancename,DATABASE = Databasename,PORT = Portnumber))
MSSQLengine = sqlalchemy.create_engine("mssql+pyodbc://@{SERVER}\\{INSTANCE}:{PORT}/{DATABASE}?driver=SQL+Server+Native+Client+11.0".format(SERVER = Servername, INSTANCE = Instancename,DATABASE = Databasename,PORT = Portnumber))
Możemy sprawdzić, czy to połączenie działa poprawnie, wykonując zapytanie za pomocą Pand. Musi odczytać zapytanie z ciągu połączenia za pomocą read_sql_query polecenie.
df = pd.read_sql_query("SELECT * FROM POSTS", MSSQLengine)
df
Uwierzytelnianie serwera SQL
Co zrobić, jeśli musisz użyć ciągu połączenia opartego na uwierzytelnianiu serwera SQL, aby połączyć się z serwerem SQL? Możemy dostosować nasz kod Pythona, aby dodać nazwę użytkownika i hasło do SQLALchemy silnik.
- Nazwa serwera =„DESKTOP-6L1B155”
- Nazwa instancji =„FogelDev”
- Nazwa bazy danych =„CODESIGHT_DEMOS”
- Numer portu =„1433”
- Nazwa użytkownika =„KodowanieSightUser”
- Hasło =„Hasło123”
print("mssql+pyodbc://{USER}:{PASS}@{SERVER}:{PORT}\\{INSTANCE}/{DATABASE}?driver=SQL+Server+Native+Client+11.0".format(SERVER = Servername, INSTANCE = Instancename,DATABASE = Databasename,PORT = Portnumber,USER = Username, PASS = Password))
MSSQLengine = sqlalchemy.create_engine("mssql+pyodbc://{USER}:{PASS}@{SERVER}\\{INSTANCE}:{PORT}/{DATABASE}?driver=SQL+Server+Native+Client+11.0".format(SERVER = Servername, INSTANCE = Instancename,DATABASE = Databasename,PORT = Portnumber,USER = Username, PASS = Password))
Ponownie testujemy nasze połączenie, ale tym razem wybieramy tylko 1 rekord z tabeli.
df = pd.read_sql_query("SELECT TOP 1 * FROM POSTS", MSSQLengine)
df
Zapisywanie danych
Na koniec spójrz na pobieranie danych Pythona do naszej tabeli bazy danych SQL Server. Tworzymy obiekt Dataframe i dołączamy go do tabeli.
Metoda Dataframe:
newdata = [{'Name': 'How to Create the Date Table in Power BI', 'Author': 'Haroon Ashraf', 'URL':'https://codingsight.com/how-to-create-date-table-in-power-bi/', 'Date':'4/21/21'}]
load_df = pd.DataFrame(newdata)
load_df.to_sql("POSTS", MSSQLengine, if_exists='append',index = False, chunksize = 200)
Inną metodą byłoby wstawienie danych bezpośrednio do tabeli za pomocą polecenia wykonania.
Metoda wykonania:
MSSQLengine.execute("INSERT INTO [POSTS] VALUES('SQL Query Optimization: 5 Core Facts to Boost Queries','Edwin Sanchez','https://codingsight.com/sql-query-optimization-5-core-facts-to-boost-queries/','3/31/21')");
Po zakończeniu stół finałowy wygląda następująco. Ma pierwsze 3 wiersze ładowane przez początkowy skrypt tworzenia SQL Server, a 4 i 5 wierszy są ładowane przez Python.
Podsumowanie
W tym poście wyróżniono parametry ciągu połączenia służące do łączenia kodu Pythona z SQL Server. Zbadaliśmy odczytywanie danych z SQL Server i sprawdziliśmy dwie różne metody uwierzytelniania – konkretny przypadek połączenia Pythona z SQL Server uwierzytelnianie Windows oraz standardowe uwierzytelnianie SQL Server. Przejrzeliśmy również metody ładowania danych, z których jedna polega na użyciu obiektu DataFrame w Pythonie, a druga to surowe polecenie SQL INSERT.