Как сохранить фрейм данных в виде таблицы в SQL - PullRequest
1 голос
/ 18 апреля 2019

У меня есть SQL Server, на котором у меня есть базы данных, для которых я хочу использовать панд для изменения этих данных.Я знаю, как получить данные с помощью pyodbc в DataFrame, но тогда я понятия не имею, как вернуть этот DataFrame обратно в мой SQL Server.

Я попытался создать движок с sqlalchemy и использовать to_sql команда, но я не могу заставить это работать, потому что мой движок никогда не может правильно подключиться к моей базе данных.

import pyodbc
import pandas
server = "server"
db = "db"
conn = pyodbc.connect('DRIVER={SQL Server};SERVER='+server+';DATABASE='+db+';Trusted_Connection=yes')
cursor = conn.cursor()
df = cursor.fetchall()
data = pandas.DataFrame(df)
conn.commit()

1 Ответ

0 голосов
/ 18 апреля 2019

Вы можете использовать pandas.DataFrame.to_sql , чтобы вставить ваш фрейм данных в SQL-сервер.Базы данных, поддерживаемые SQLAlchemy , поддерживаются этим методом.

Вот пример того, как этого можно достичь:

from sqlalchemy import create_engine, event
from urllib.parse import quote_plus
import logging
import sys
import numpy as np
from datetime import datetime, timedelta

# setup logging
logging.basicConfig(stream=sys.stdout, 
                filemode='a', 
                format='%(asctime)s.%(msecs)3d %(levelname)s:%(name)s: %(message)s', 
                datefmt='%m-%d-%Y %H:%M:%S', 
                level=logging.DEBUG)
logger = logging.getLogger(__name__)    # get the name of the module

def write_to_db(df, database_name, table_name):
    """
    Creates a sqlalchemy engine and write the dataframe to database
    """
    # replacing infinity by nan
    df = df.replace([np.inf, -np.inf], np.nan)

    user_name = 'USERNAME'
    pwd = 'PASSWORD' 
    db_addr = '10.00.000.10'
    chunk_size = 40 

    conn =  "DRIVER={SQL     Server};SERVER="+db_addr+";DATABASE="+database_name+";UID="+user_name+";PWD="+pwd+""
    quoted = quote_plus(conn)
    new_con = 'mssql+pyodbc:///?odbc_connect={}'.format(quoted)

    # create sqlalchemy engine
    engine = create_engine(new_con)

    # Write to DB
    logger.info("Writing to database ...")
    st = datetime.now() # start time
    # WARNING!! -- overwrites the table using if_exists='replace'
    df.to_sql(table_name, engine, if_exists='replace', index=False, chunksize=chunk_size)
    logger.info("Database updated...")
    logger.info("Data written to '{}' databsae into '{}' table ...".format(database_name, table_name))
    logger.info("Time taken to write to DB: {}".format((datetime.now()-st).total_seconds()))

Вызов этого метода должен записать ваш фрейм данных вобратите внимание, что он заменит таблицу, если в базе данных уже есть таблица с таким именем.

...