问题描述
我正在尝试使用 pyodbc 连接到 Microsoft sql server 数据库。我不断收到错误
错误: ('01000',"[01000] [unixODBC][Driver Manager]无法打开 lib 'ODBC Driver 17 for sql Server': 文件未找到 (0) (sqlDriverConnect)")
检查 pyodbc.drivers()
没有结果
我根据 here 提供的说明安装了 Microsoft ODBC 驱动程序:
我运行了 odbcinst -j
,结果是
DRIVERS............: /etc/odbcinst.ini
SYstem DATA SOURCES: /etc/odbc.ini
FILE DATA SOURCES..: /etc/ODBCDataSources
USER DATA SOURCES..: /Users/pawannandakishore/.odbc.ini
sqlULEN Size.......: 8
sqlLEN Size........: 8
sqlSETPOSIROW Size.: 8
但是当我到达 /etc
时,我找不到 odbcinst.ini
或 odbc.ini
。他们似乎在opt/homebrew/Cellar/
我真的很感激这方面的帮助。
解决方法
更新:
您实际上可以在容器中使用 pyodbc
,但容器应该在 x86_64 架构容器中构建和执行。为此,您需要将 platform
添加到 docker-compose.yml
或在容器运行期间(使用 docker 时)提供参数。
您需要确保使用 buildx!
码头工人:
docker buildx build --platform linux/amd64 -t myimage .
docker run --platform linux/amd64 myimage bash
Docker-compose:
version: "3.9"
services:
web:
image: myimage:latest
build:
context: ./
platform: linux/amd64
原答案:
pyodbc
确实不支持 ARM 架构。我在 M1 上使用 pymssql
以连接到 MSSQL 服务器。
-
您需要安装系统要求
freetds-dev
。对于高山容器,它将是apk add freetds-dev
-
在 pip 要求中添加
pymssql
包。 -
使用简单脚本测试连接:
import pymssql
conn = pymssql.connect(server='mssql',user='SA',password='Passw@rd',database='master')
cursor = conn.cursor()
cursor.execute("""SELECT 1;""")
- SqlAlchemy 连接应该如下所示
SQLALCHEMY_DATABASE_URI = (
f"mssql+pymssql://{MSSQL_USER}:{MSSQL_PASSWORD}@{MSSQL_HOST}/{MSSQL_DB}?"
)
如果您需要在 M1 上运行 MSSQL 数据库 - 这是我对这个问题的回答 https://stackoverflow.com/a/66919852/11515610
相关链接:
-
Adaptive server connection failed (DB-Lib error message 20002,severity 9)
-
https://docs.sqlalchemy.org/en/14/dialects/mssql.html#module-sqlalchemy.dialects.mssql.pymssql
-
https://pymssql.readthedocs.io/en/stable/pymssql_examples.html
确实,M1 Mac 尚不支持 ODBC 驱动程序。
但是!您可以使用 pymssql
库进行连接和查询。这在我的 M1 MacBook Pro 13" 上完美运行
通过 Homebrew 安装 FreeTDS
brew install freetds
使用 pip 安装
然后使用pip(或pip3)安装pymssql
:
pip3 install pymssql
开始编码!
然后,只需将其导入到您的代码中即可!这是一个例子:)
import os
import pymssql
server = <your_server>
user = <username>
password = <password>
conn = pymssql.connect(server,user,password,"<your_database>")
c1 = conn.cursor()
c1.execute('SELECT * FROM <your_table>')
data = c1.fetchall()
print(data)
conn.close()
Here the docs 从 pymssql
到更多详细信息。