Source code for mydatapreprocessing.database.database_internal

"""Module for database subpackage."""

from __future__ import annotations
from typing import TYPE_CHECKING

from typing_extensions import Literal
import pandas as pd

from mypythontools.system import check_library_is_available

# Lazy imports
if TYPE_CHECKING:
    import sqlalchemy
    import urllib


[docs]def database_load( query: str, server: str, database: str, port: str | int | None = None, driver: str = "{SQL Server}", username: str | None = None, password: str | None = None, trusted_connection: bool = False, ) -> pd.DataFrame: """Load database into DataFrame. Args: query (str): Used query. server (str): Name of server. database (str): Name of database. port (str | int | None, optional): Used port. May work with None. Defaults to None. driver (str, optional): Used driver. One can be downloaded on https://docs.microsoft.com/en-us/sql/connect/odbc/download-odbc-driver-for-sql-server?view=sql-server-ver15 Defaults to '{SQL Server}'. username (str | None, optional): Username. 'sa' for root on mssql. password (str | None, optional): Password. trusted_connection (bool, optional): If using windows authentication. Returns: pd.DataFrame: DataFrame with data from database based on input SQL query. Example: :: data = mdp.database.database_load( server=".", database="DemoData", query=''' SELECT TOP (1000) [ID] ,[ProductName] FROM [DemoData].[dbo].[Products] ''', username="sa", password="HelloPassword123", ) """ connection = _create_connection( server=server, database=database, port=port, driver=driver, username=username, password=password, trusted_connection=trusted_connection, ) df = pd.read_sql(query, connection) return df
[docs]def database_write( df: pd.DataFrame, server: str, database: str, table: str, index: bool = False, port: str | int | None = None, driver: str = "{SQL Server}", username: str | None = None, password: str | None = None, trusted_connection: bool = False, schema: None | str = None, if_exists: Literal["fail", "replace", "append"] = "append", ) -> None: """Deploy DataFrame to SQL server. Args: df (pd.DataFrame): DataFrame passed to database. server (str): Name of server. database (str): Name of database. table (str): Used table. index (bool, optional): Whether use index as a column Defaults to False. port (str | int | None, optional): Used port. May work with None. Defaults to None. driver (str, optional): Used driver. One can be downloaded on https://docs.microsoft.com/en-us/sql/connect/odbc/download-odbc-driver-for-sql-server?view=sql-server-ver15 Defaults to '{SQL Server}'. username (str | None, optional): Username. 'sa' for root on mssql. Defaults to None. password (str | None, optional): Password. Defaults to None. trusted_connection (bool, optional): If using windows authentication. You don't need username and password then. Defaults to False. schema (None | str, optional): Used schema. Defaults to None. if_exists (Literal['fail', 'replace', 'append'], optional): Define whether append new data on the end, remove and replace or fail if table exists. Defaults to 'append'. Example: :: import pandas as pd df = pd.DataFrame([[1, 2, 3], [4, 5, 6]]) mdp.database.database_write( df, server=".", database="DemoData", table="Products", username="sa", password="HelloPassword123", if_exists="replace", ) """ connection = _create_connection( server=server, database=database, driver=driver, port=port, username=username, password=password, trusted_connection=trusted_connection, ) df.to_sql(name=table, con=connection, if_exists=if_exists, index=index, schema=schema)
def _create_connection( server: str, database: str, port: str | int | None = None, driver: str = "{SQL Server}", username: str | None = None, password: str | None = None, trusted_connection: bool = False, ) -> "sqlalchemy.engine.base.Engine": """Create connection, that can be used in another function to connect the database. Args: server (str): Name of server. database (str): Name of database. port (str | int | None, optional): Used port. May work with None. Defaults to None. driver (str, optional): Used driver. One can be downloaded on https://docs.microsoft.com/en-us/sql/connect/odbc/download-odbc-driver-for-sql-server?view=sql-server-ver15 Defaults to '{SQL Server}'. username (str | None, optional): Username. 'sa' for root on mssql. Defaults to None. password (str | None, optional): Password. Defaults to None. trusted_connection (bool, optional): If using windows authentication. Defaults to False. """ check_library_is_available("sqlalchemy") from sqlalchemy import create_engine import urllib.parse connection_string = f"DRIVER={driver};SERVER={server};DATABASE={database};" if port: connection_string = connection_string + f"PORT={str(port)};" if trusted_connection: connection_string = connection_string + "Trusted_Connection=yes;" if username: connection_string = connection_string + f"UID={username};" if password: connection_string = connection_string + f"PWD={password};" params = urllib.parse.quote_plus(connection_string) conn_str = f"mssql+pyodbc:///?odbc_connect={params}" return create_engine(conn_str)