当使用Python 3.5与Pandas和SQLAlchemy尝试从CSV文件在SQL Server 2016中创建新的数据库表时出现错误。

3

问题

我正在尝试使用Python读取我的CSV文件,并将其作为新表插入到Microsoft SQL Server 2016中。简单来说,我不想在SQL上创建表并导入CSV,我想编写一个Python脚本,它可以读取CSV并为我创建一个新的SQL表。

更新

我可能需要重新考虑我的方法。我已经更正了驱动程序,但是从to_sql返回以下错误。我认为我的身份验证方案有问题。遗憾的是,to_sql文档和sql_alchemy并没有提供太多帮助。开始考虑其他选择。

sqlalchemy.exc.DBAPIError was unhandled by user code
Message: (pyodbc.Error) ('08001', '[08001] [Microsoft][SQL Server Native Client 11.0]Named Pipes Provider: Could not open a connection to SQL Server [53].  (53) (SQLDriverConnect)')

代码

import pandas as pd 
import sqlalchemy

#Read the file 
data = pd.read_csv(file.csv)

#Connect to database and write the table 
 server = "DERPSERVER"
 database = "HERPDB"
 username = "DBUser" 
 password = "password"
 tablename = "HerpDerpTable"
 driver = "SQL+Server+Native+Client+11.0" 

 #Connect to SQL using SQL Server Driver 
 print("Connect to SQL Server")
 cnxn = sqlalchemy.create_engine("mssql+pyodbc://"+username+":"+password+"@"+server +"/"+database + "?driver="+driver)

更新

我将字符串重写如下,但它不起作用:

sqlalchemy.create_engine('mssql+pymssql://'+username+':'+ password + '@' + server + '/' + database + '/?charset=utf8')


data.to_sql(tablename, cnxn);

尝试

以下是我处理此问题的一些重要事项。请特别注意下面我分享的第二个要点。我认为我的 create_engine 连接字符串可能有误,但不知道错在哪里,因为我按照文档进行操作。

  • 我认为我处于无DSN的情况中。因此,我试图通过文档中描述的其他方式进行连接。
  • 我使用此链接来帮助我创建 create_engine 中的连接字符串部分。
  • 我尝试使用 to_sql 将数据写入数据库,但我认为我的连接字符串仍然可能出错了?我参考了stackoverflow上的问题
  • 更新 我添加了MaxU指定的驱动程序规范,就像SQLAlchemy文档规定的那样。然而,我收到了一个错误消息,说找不到我的数据源名称,并且没有默认驱动程序与 to_sql 指定。我需要向 to_sql 提供驱动程序吗?如果是,请问文档或示例代码在哪里,以便我了解我做错了什么?

我正在努力学习Python,并将其用作脚本语言,因为有未来的目标和需求。我会感激任何提供帮助、协助或指导的人。


你的SQLAlchemy版本是多少? - MaxU - stand with Ukraine
@MaxU 我不确定,昨天我只是使用Python pip安装了它。所以我认为你的指示是相关的。然而,我遇到了一个问题,我很快会更新我的问题。 - hlyates
1个回答

6

如果你使用SQLAlchemy 1.0.0及以上版本,你应该显式指定MS SQL Server驱动程序:

例如:

engine = create_engine("mssql+pyodbc://scott:tiger@myhost:port/databasename?driver=SQL+Server+Native+Client+10.0")

在版本1.0.0中有所更改:基于主机名的PyODBC连接现在需要明确指定SQL Server驱动程序名称。SQLAlchemy无法选择最佳默认值,因为它根据平台和安装的驱动程序而变化。 本机SQL Server客户端名称列表 SQL Server 2005:
SQL Server Native Client
SQL Server 2008:
SQL Server Native Client 10.0
SQL Server 2016:
SQL Server Native Client 11.0
或者您可以使用pymssql
engine = create_engine('mssql+pymssql://<username>:<password>@<freetds_name>/?charset=utf8')

1
@hlyates,你可能想尝试使用SQL Server Native Client 11.0 for SQL Server 2016 - MaxU - stand with Ukraine
我已经这样做了,并更新了我的当前问题。当我与一个工具斗争太久时,我会开始考虑其他方法。我想要一种标准的编写Python脚本的方式,以将我的CSV数据创建为SQL数据库中的表格。你能提供建议吗? - hlyates
1
@hlyates, df.to_sql('table_name', sqlalchemy_engine_object) - 只要 sqlalchemy_engine_object 是有效的 SQLAlchemy 引擎对象,就应该可以工作。 - MaxU - stand with Ukraine
1
它没有DSN,但我认为它与SQL身份验证过程有关。错误非常糟糕,完全是通用的,基本上是“出了点问题”。让我去猜测。正如链接所示,我相信微软强制用户使用连接字符串和命令的长路线。在链接中使用pyodbc揭示了ODBC Driver 13 for SQL Server可能是魔法。我真的觉得上述方法更可取,而且我已经接近了,但我相信我无法通过我得到的通用错误找到问题的根源。 :-( - hlyates
1
@hlyates,感谢您详细的解释 - 这可能会帮助其他可能遇到同样问题的人。 - MaxU - stand with Ukraine
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接