【问题标题】:pandas to_sql for MS SQL用于 MS SQL 的 pandas to_sql
【发布时间】:2019-07-05 10:22:00
【问题描述】:

我正在尝试将数据帧保存到使用 Windows 身份验证的 MS SQL。我试过使用engineengine.connect()engine.raw_connection(),它们都会抛出错误: 分别为'Engine' object has no attribute 'cursor''Connection' object has no attribute 'cursor'Execution failed on sql 'SELECT name FROM sqlite_master WHERE type='table' AND name=?;': ...

params = urllib.parse.quote('DRIVER={ODBC Driver 13 for SQL Server};'
                           'SERVER=server;'
                           'DATABASE=db;'
                           'TRUSTED_CONNECTION=Yes;')

engine = create_engine('mssql+pyodbc:///?odbc_connect=%s' % params)

df.to_sql(table_name,engine, index=False)

【问题讨论】:

    标签: sql-server pandas sqlalchemy pandas-to-sql


    【解决方案1】:

    这将完全符合您的要求。

    # Insert from dataframe to table in SQL Server
    import time
    import pandas as pd
    import pyodbc
    
    # create timer
    start_time = time.time()
    from sqlalchemy import create_engine
    
    
    df = pd.read_csv("C:\\your_path\\CSV1.csv")
    
    conn_str = (
        r'DRIVER={SQL Server Native Client 11.0};'
        r'SERVER=name_of_your_server;'
        r'DATABASE=name_of_your_database;'
        r'Trusted_Connection=yes;'
    )
    cnxn = pyodbc.connect(conn_str)
    
    cursor = cnxn.cursor()
    
    for index,row in df.iterrows():
        cursor.execute('INSERT INTO dbo.Table_1([Name],[Address],[Age],[Work]) values (?,?,?,?)', 
                        row['Name'], 
                        row['Address'], 
                        row['Age'],
                        row['Work'])
        cnxn.commit()
    cursor.close()
    cnxn.close()
    
    # see total time to do insert
    print("%s seconds ---" % (time.time() - start_time))
    

    【讨论】:

    • 您正在导入 sql alchemy 并创建引擎但未使用它。这是纯粹的pyodbc。
    【解决方案2】:

    这是对我原始答案的更新。基本上,这是老式的做事方式(INSERT INTO)。我最近偶然发现了一种将数据从 Python 推送到 SQL Server 的超级简单、可扩展和可控的方法。如果您有其他问题,请尝试示例代码并回复。

    import pyodbc
    import pandas as pd
    
    engine = "mssql+pyodbc://your_server_name/your_database_name?driver=SQL Server Native Client 11.0?trusted_connection=yes"
    
    ... dataframe here...
    
    dataframe.to_sql(x, engine, if_exists='append', index=True)
    

    数据框很容易解释。

    x = 您希望表在 SQL Server 中的名称。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-24
      • 2020-11-20
      • 1970-01-01
      • 1970-01-01
      • 2021-03-11
      • 2018-04-09
      • 2017-05-24
      • 1970-01-01
      相关资源
      最近更新 更多