【问题标题】:Unable to use pydobc to connect to SQL Server using pyodbc in Python 3.6 in AWS Lambda无法使用 pydobc 在 AWS Lambda 中使用 Python 3.6 中的 pyodbc 连接到 SQL Server
【发布时间】:2018-12-21 06:36:17
【问题描述】:

我一直在苦苦挣扎,无法弄清楚如何通过 pydobc 和 AWS Lambda 使用 python 3.6 连接到 SQL Server。

我按照 AWS 提供的说明创建了一个 Amazon Linux AMI,我能够在其上安装 Microsoft ODBC 驱动程序(v13 和 v17),将 unixODBC 升级到支持的版本,并让我的 python 代码连接到AWS RDS SQL Server 实例。

但是,我无法弄清楚如何成功打包这些更改以将此代码部署到 AWS Lambda 并使其正常工作。

我得到两个错误之一,这取决于我尝试引用 ODBC 驱动程序的方式。使用这种语法

cnxn = pyodbc.connect('DRIVER={SQL Server};SERVER=servername.account.region.rds.amazonaws.com,port;DATABASE=database;UID=user;PWD=password'

我得到错误:

"errorMessage": "('01000', \"[01000] [unixODBC][Driver Manager]Can't open lib 'SQL Server' : file not found (0) (SQLDriverConnect)\")",

我尝试使用其他驱动程序别名(SQL Server 的 ODBC 驱动程序 17,SQL Server 的 ODBC 驱动程序 13),结果相同。

使用语法:

    cnxn = pyodbc.connect('DRIVER=lib/libmsodbcsql-13.so;SERVER=servername.account.region.rds.amazonaws.com,port;DATABASE=database;UID=user;PWD=password')

我得到错误:

'IM004', "[IM004] [unixODBC][Driver Manager]Driver's SQLAllocHandle on SQL_HANDLE_HENV failed (0) (SQLDriverConnect)")

我的 .ZIP 部署文件中有以下代码:

  1. simple_db.py - 我创建连接的代码
  2. pyodbc.so - 来自 https://github.com/Miserlou/lambda-packages/tree/master/lambda_packages/pyodbc 的 pyodbc 的 Lambda 版本
  3. odbcinst.ini - 尝试使用 Linux 版本的 odbcinst 来列出驱动程序。
  4. lib/libmsodbcsql-13.so - 从 Amazon Linux 安装复制
  5. libodbc.so.2 - 同样从 Amazon Linux 安装复制,尝试部署 unixODBC 版本。

我玩弄了目录,并从 /usr/lib64 目录添加了更多 libodbc*.* 文件,但到目前为止没有任何效果。以及带来整个 msodbcsql 目录(带有 /etc、/include、/lib64 和 /share)。

任何帮助将不胜感激!

【问题讨论】:

  • Driver 名称看起来是 Windows。通常是 ODBC Driver 13 for SQL ServerODBC Driver 17 for SQL Server for Unix。它必须与 odbc.ini 文件中的值匹配。
  • 你能解决吗?你能帮我吗:stackoverflow.com/questions/58365543/…

标签: python sql-server amazon-web-services aws-lambda pyodbc


【解决方案1】:

基于此答案:AWS Lambda function to connect to SQL Server with Python

您需要编译 unixODBC,获取它的共享库。然后安装 MS 驱动,获取它的共享库并聚集在一起

# Start a container that mimic the lambda environment
docker run -it --rm --entrypoint bash  -e ODBCINI=/var/task -e ODBCSYSINI=/var/task -v "$PWD":/var/task  lambci/lambda:build-python2.7

# Then, download ODBC source code, compile and take the output
curl ftp://ftp.unixodbc.org/pub/unixODBC/unixODBC-2.3.5.tar.gz -O
tar xvzf unixODBC-2.3.5.tar.gz
cd unixODBC-2.3.5
./configure  --sysconfdir=/var/task  --disable-gui --disable-drivers --enable-iconv --with-iconv-char-enc=UTF8 --with-iconv-ucode-enc=UTF16LE --prefix=/home
make install
cd ..
mv /home/* .
mv unixODBC-2.3.5 unixODBC-2.3.5.tar.gz /tmp/

# Install MSsql odbc driver
curl https://packages.microsoft.com/config/rhel/6/prod.repo > /etc/yum.repos.d/mssql-release.repo
ACCEPT_EULA=Y yum -y install msodbcsql
export CFLAGS="-I/var/task/include"
export LDFLAGS="-L/var/task/lib"

# Then you can install pyodbc (or pip install -t . -r requirements.txt)
pip install pyodbc -t .

cp -r /opt/microsoft/msodbcsql .

cat <<EOF > odbcinst.ini
[ODBC Driver 13 for SQL Server]
Description=Microsoft ODBC Driver 13 for SQL Server
Driver=/var/task/msodbcsql/lib64/libmsodbcsql-13.1.so.9.2
UsageCount=1
EOF

cat <<EOF > odbc.ini
[ODBC Driver 13 for SQL Server]
Driver      = ODBC Driver 13 for SQL Server
Description = My ODBC Driver 13 for SQL Server
Trace       = No
EOF

# Test if it works
python -c "import pyodbc; print(pyodbc.drivers());"
python -c 'import pyodbc;conn = pyodbc.connect("DRIVER={ODBC Driver 13 for SQL Server}; SERVER=YOUr_SERVER:ADD;PORT=1443;DATABASE=TestDB;UID=SA;PWD=<YourStrong!Passw0rd>");crsr = conn.cursor();rows = crsr.execute("select @@VERSION").fetchall();print(rows);crsr.close();conn.close()'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-13
    • 2017-10-12
    • 1970-01-01
    相关资源
    最近更新 更多