如何使用SQLAlchemy和pyodbc将Scrapinghub上部署的Scrapy spider连接到远程SQL服务器?

问题描述:

在尝试自行解决此问题后,我需要一些帮助或向正确方向推动。如何使用SQLAlchemy和pyodbc将Scrapinghub上部署的Scrapy spider连接到远程SQL服务器?

我在Scrapinghub上编写并部署了Scrapy蜘蛛。该蜘蛛收集一些数据,并在完成后将该数据保存到远程Microsoft SQL Server。我使用SQLAlchemy作为ORM和Pyodbc作为驱动程序。 为了连接到一个数据库中蜘蛛的代码,我使用:

params = quote_plus('DRIVER={ODBC Driver 13 for SQL Server};SERVER="server";DATABASE="db";UID="user";PWD="pass") 
engine = create_engine("mssql+pyodbc:///?odbc_connect={}".format(params)) 

在我的本地PC与Win10一切都很好 - 蜘蛛成功地连接到远程数据库并保存数据。 但是,如果我尝试运行Scrapinghub这种蜘蛛,我得到一个错误: DBAPIError: (pyodbc.Error) ('01000', "[01000] [unixODBC][Driver Manager]Can't open lib 'ODBC Driver 13 for SQL Server' : file not found (0) (SQLDriverConnect)")

好像与DRIVER部分问题。我试图将DRIVER={ODBC Driver 13 for SQL Server}更改为DRIVER={SQL Server}DRIVER={FreeTDS},但仍得到相同的错误can't open lib 'lib_name' : file not found

Scrapinghub是否支持连接到Microsoft SQL Server?我需要使用哪些驱动程序参数才能成功连接?

谢谢!

+0

我想你需要[定制Docker镜像](https://shub.readthedocs.io/en/stable/deploy-custom-image.html)与所需的ODBC驱动程序 –

+0

谢谢你的回应@paul trmbrth!我还使用Scrapy-Splash和这个蜘蛛,如果我使用定制的Docker镜像,我可以实现所有需要的功能吗?你可以建议,也许我已经可以使用预制图像?我不是很熟悉Docker部署,并尝试按照本教程进行操作:https://blog.scrapinghub.com/2016/09/08/how-to-deploy-custom-docker-images-for-your-web-crawlers/ 但不幸的是,所有这些都不能按预期工作,现在我有两个问题:) – Vlad

+0

如果您在Dockerfile中添加“pip install scrapy-splash”步骤,则使用scrapy-splash不是问题。我不知道Scrapinghub是否与这些驱动程序预先建立了映像。最好是联系Scrapinghub支持,如果他们有。 –

Can't open lib 'ODBC Driver 13 for SQL Server' : file not found

以上错误通常与错误配置或缺少odbcinst.ini文件有关。

运行odbcinst -j并验证odbcinst.ini确实存在并且它具有正确的驱动程序路径,例如,

[ODBC Driver 13 for SQL Server] 
Description=Microsoft ODBC Driver 13 for SQL Server 
Driver=/usr/local/lib/libmsodbcsql.13.dylib 

下面是示例命令创建用户的配置文件(~/.odbcinst.ini):

printf "[ODBC Driver 13 for SQL Server]\nDescription=Microsoft ODBC Driver 13 for SQL Server\nDriver=/usr/local/lib/libmsodbcsql.13.dylib\n" >> ~/.odbcinst.ini 

参见:Installing the Microsoft ODBC Driver for SQL Server on Linux and macOS

如果您使用的是Anaconda,请检查此问题:ODBC Driver 13 for SQL Server can't open lib