muj*_*jno 3 python sql-server pyodbc docker alpine-linux
我有一个基于 alpine 的 docker 镜像,支持 Python,我试图通过它连接到 Azure SQL 服务。这是我的简单连接代码。连接到 Azure 中的 SQL 服务器时出现错误。
conn = pyodbc.connect('DRIVER='+driver+';SERVER='+server+';PORT=1433;DATABASE='+database+';UID='+username+';PWD='+ password) pyodbc.Error: ( '01000', "[01000] [unixODBC][Driver Manager] 无法打开 lib 'ODBC Driver 17 for SQL Server':找不到文件 (0) (SQLDriverConnect)")nect)")
import pyodbc
server = 'blah1.database.windows.net'
database = 'mydb1'
username = 'myadmin'
password = 'XXXXXX'
driver= 'ODBC Driver 17 for SQL Server'
conn = pyodbc.connect('DRIVER='+driver+';SERVER='+server+';PORT=1433;DATABASE='+database+';UID='+username+';PWD='+ password)
c = conn.cursor()
c.execute("SELECT * FROM dbo.customers")
print(c.fetchall())
print(type(c.fetchall()))
conn.commit()
conn.close()
Here is my Dockerfile:
FROM tiangolo/uwsgi-nginx:python3.7-alpine3.8
RUN apk update
RUN apk add gcc libc-dev g++ libffi-dev libxml2 unixodbc-dev
LABEL Name=code9 Version=0.0.1
EXPOSE 8000
ENV LISTEN_PORT=8000
ENV UWSGI_INI uwsgi.ini
WORKDIR /app
ADD . /app
RUN chmod g+w /app
RUN chmod g+w /app/db.sqlite3
RUN python3 -m pip install -r requirements.txt
Run Code Online (Sandbox Code Playgroud)
我假设我是 unixODBC 将负责与 Azure 中的 SQL 服务器的连接,或者我是否需要为 alpine 安装 MS SQL 驱动程序?有没有可用的?我找不到一个。请帮忙。
确认设置:
apk update && apk add build-base unixodbc-dev freetds-dev
pip install pyodbc
Run Code Online (Sandbox Code Playgroud)
为什么要同时安装 unixodbc 和 freetds?Pyodbc 的 pip 安装需要 unixodbc-dev 中的包和 build-base 中的 gcc 库,所以没有解决这个问题。freetds 驱动程序与 pyodbc 的问题往往较少,并且非常依赖pymssql,我一直在 docker 中使用它代替 pyodbc。不过,这是个人偏好,您可以只包含 unixodbc 驱动程序。现在,找到驱动程序
import pyodbc
pyodbc.drivers()
# []
Run Code Online (Sandbox Code Playgroud)
Pyodbc 找不到它们,但它们肯定已安装,因此我们可以通过 shell 脚本找到它们:
find / -name *odbc.so
/usr/lib/libtdsodbc.so
/usr/lib/libodbc.so
Run Code Online (Sandbox Code Playgroud)
现在,我们可以使用subprocess库自动执行此操作以手动设置驱动程序位置:
import subprocess
s = subprocess.Popen('find / -name *odbc.so -type f', stdout=subprocess.PIPE, shell=True).communicate()
f, _ = s
# You can change this particular loop to select whatever driver you prefer
driver = [driver for driver in f.decode().split() if 'tds' in driver][0]
driver
# '/usr/lib/libtdsodbc.so'
username = 'someuser'
server = 'someserver'
database = 'somedatabase'
conn = pyodbc.connect('DRIVER='+driver+';SERVER='+server+';PORT=1433;DATABASE='+database+';UID='+username+';PWD='+ password)
Run Code Online (Sandbox Code Playgroud)
或者,您可以将配置添加到此处/etc/odbcinst.ini提到的:
[FreeTDS]
Description=FreeTDS Driver
Driver=/usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so
Run Code Online (Sandbox Code Playgroud)
然后
[FreeTDS]
Description=FreeTDS Driver
Driver=/usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2353 次 |
| 最近记录: |