【问题标题】:Pandas dataframe for loading into SQL server studio through Import wizard通过导入向导加载到 SQL Server Studio 的 Pandas 数据框
【发布时间】:2018-04-18 21:42:51
【问题描述】:

我是 Python 和 SQL Server Studio 的新手。我在 python 中有一个报废代码,它从互联网上收集数据,将其保存到 pandas 数据框中,最终将数据写入 csv。它一次抓取 100 行并将其保存到 csv 中。我得到了 100 个这样的 csv,我将它们附加在一起,然后转换成一个大文件。我确实需要 100 个单独的 csv。

现在,当我尝试通过导入向导将此合并的 csv 加载到 SQL Server 管理工作室时,我收到截断错误。我检查并发现有几行的字符串长度超过 256 个字符。

有没有办法解决这个问题。我的另一种选择是将字符长度限制为 256 个字符,同时将其导出到 csv(我知道这不是最佳解决方案,但它对我有用),如何在将 pandas 数据帧写入 csv 时实现这一点。有没有其他格式可以保存,然后通过 windows 导入向导加载。

任何帮助将不胜感激,因为我对数据库和 python 真的很陌生。提前谢谢你。

【问题讨论】:

    标签: python sql database pandas truncation


    【解决方案1】:

    考虑在 SQLAlchemy API 上分层的 pandas 的 to_sql 方法,您可以在其中追加或替换数据库表中的数据。 SQLAlchemy 与标准 Python-SQL Sever DB-API 接口,例如 pyodbcpymssql。因此,请在使用前安装。

    import pyodbc
    import sqlalchemy
    
    engine = sqlalchemy.create_engine("mssql+pyodbc://user:pwd@server/database", echo=False)
    
    mydataframe.to_sql('mytable', con=engine, if_exists='replace')
    
    engine.dispose()
    

    与各种导入向导不同,此方法在 pandas 数据框和您的 SQL Server 数据库表之间建立直接的 SQL 连接。使用 replace,该方法实际运行 DROP TABLE ...,然后是 CREATE TABLE ...,最后是 INSERT INTO ...,使用 pandas 数据帧的数据类型或用户在 @ 的 dtype 参数中指定的数据类型987654330@.

    【讨论】:

    • 根据我的经验,唯一需要注意的是,直接 to_sql 方法仅适用于小型数据集。当它变成一组更大的项目(> 10000 行)时, to_sql 需要很长时间。我更喜欢使用相同的方法转储到 CSV 文件,但使用 to_csv 方法,然后使用数据库导入器从与数据库位于同一网络上的位置导入 CSV 文件。
    • @Parfait 我会试试看,你能确认我需要通过示例传递的参数吗,比如我在哪里传递我的用户名、服务器等是正确的(“mssql+pyodbc://my_user_name :my_password@my_server/my_database", echo=False) 然后是 mydataframe.to_sql('my_database', con=engine, if_exists='replace') 我希望我的数据库和表名相同
    • 这看起来是正确的。试一试,然后报告。但是,您不是转储到数据库中,而是转储到数据库表中。所以,my_database 应该是 my_table
    • 还有@dg3781 ...有趣的一点。其他因素可能会影响它,包括本地/远程服务器连接、列数和数据类型等。当然 LONG 也是相对的。有些可以等5分钟。用于批量处理!
    • @Parfait 最初它给了我这个错误C:\ProgramData\Anaconda2\lib\site-packages\sqlalchemy\connectors\pyodbc.py:92: SAWarning: No driver name specified; this is expected by PyODBC when using DSN-less connections "No driver name specified; ",我为此添加了?driver=SQL+Server+Native+Client+11.0", echo=False) 就像这样engine = sqlalchemy.create_engine("mssql+pyodbc://user:pwd@server/database?driver=SQL+Server+Native+Client+11.0", echo=False) 但是现在,我有这个错误
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-20
    • 1970-01-01
    • 2011-11-18
    相关资源
    最近更新 更多