【问题标题】:How to Save a Data Frame as a table in SQL如何在 SQL 中将数据框另存为表
【发布时间】:2019-09-09 00:56:16
【问题描述】:

我有一个 SQL Server,上面有我想使用 pandas 来更改数据的数据库。我知道如何使用 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()

【问题讨论】:

  • 当你使用df.to_sql()时会出现什么错误,你传递了什么参数?

标签: sql-server pandas pyodbc


【解决方案1】:

您可以use pandas.DataFrame.to_sql 将您的数据框插入 SQL Server。 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()))

调用这个方法应该将你的数据框写入数据库,注意如果数据库中已经有同名的表,它将替换该表。

【讨论】:

  • 我应该可以复制粘贴这个 def 并输入三个变量来使用它吗?
  • 这是我得到的错误: (pyodbc.InterfaceError) ('IM002', '[IM002] [Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified (0) (SQLDriverConnect); [IM002] [Microsoft][ODBC Driver Manager] Invalid connection string attribute (0)')(此错误的背景:sqlalche.me/e/rvf5
  • 我不确定您的数据库是如何设置的。您可以使用完全相同的功能,这应该可以工作。您需要在函数中更改数据库的用户名、密码和 IP 地址,然后传递这三个变量。
  • 我知道我的用户名和密码是什么,但我怎么知道数据库的 IP 地址?同样使用您代码的日志记录部分,我尝试使用它,但我收到一条错误消息,指出“sys”未定义
  • 可以通过命令行ping得到数据库的ip地址。我忘记在代码中导入 sys,我现在改了。
猜你喜欢
  • 2021-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-31
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
相关资源
最近更新 更多