Pyodbc在M1 Mac上的应用

9
我正在尝试使用pyodbc连接到Microsoft SQL Server数据库,但是一直出现错误:
``` Error: ('01000', "[01000] [unixODBC][Driver Manager]Can't open lib 'ODBC Driver 17 for SQL Server' : file not found (0) (SQLDriverConnect)") ```
通过检查 `pyodbc.drivers()` 发现没有结果。
根据提供的说明,我安装了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.iniodbc.ini。它们似乎在 opt/homebrew/Cellar/ 目录下。

我会非常感激任何关于此的帮助。


3
根据 在 macOS 上安装 Microsoft ODBC 驱动程序以连接 SQL Server:Microsoft ODBC 驱动程序仅支持 x64 架构的 macOS,不支持 Apple M1。也许在他们提供支持之前可以尝试使用 FreeTDS? - AlwaysLearning
@AlwaysLearning,这是事实上错误的。官方页面说:“...只支持x64架构直到17.7版本。从17.8版本开始添加了对Apple M1(ARM64)的支持...” - gmarais
@gmarais,这句话在一年前写的时候是正确的。直到四个月后的2021年7月,Microsoft才发布了SQL Server的ODBC Driver 17.8版本。 - AlwaysLearning
3个回答

8

更新:

实际上,您可以在容器中使用pyodbc,但是容器应该在x86_64架构容器中构建和执行。为了做到这一点,您需要将platform添加到docker-compose.yml或在容器运行时(使用docker时)提供参数。 您需要确保使用buildx构建容器!

Docker:

  • 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 服务器。

  1. 你需要安装系统要求的 freetds-dev。对于 alpine 容器,可以使用 apk add freetds-dev 命令来安装。

  2. 在 pip 要求中添加 pymssql 包。

  3. 使用简单脚本测试连接:

import pymssql
conn = pymssql.connect(server='mssql', user='SA', password='Passw@rd', database='master')
cursor = conn.cursor()
cursor.execute("""SELECT 1;""")
  1. SqlAlchemy连接应该是这样的
SQLALCHEMY_DATABASE_URI = (
    f"mssql+pymssql://{MSSQL_USER}:{MSSQL_PASSWORD}@{MSSQL_HOST}/{MSSQL_DB}?"
)

如果您需要在 M1 上运行 MSSQL 数据库,请参考以下链接 https://dev59.com/alEG5IYBdhLWcg3weu4p#66919852
相关链接:

如果您使用amd64容器,性能会受到影响。最好使用FreeTDS。 - Nick

7

实际上,ODBC驱动程序尚未支持M1 Macs。

但是!您可以使用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()

这里是文档,提供了有关pymssql的更多详细信息。


更新于2023年3月16日:已更新pymssql文档链接


2023年5月25日更新:来自微软官方文档:

从17.8版本开始添加了对苹果ARM64的支持。Homebrew公式将检测架构并自动安装正确的软件包。

确实,ODBC驱动程序现在已经支持ARM架构笔记本电脑(M芯片系列)。


谢谢!没错,它与pymssql一起工作。 - Pawan nandakishore
2
请注意,您也可以在pyodbc中使用FreeTDS。但是您提供的pymssql示例也很好! - Nick
尝试过这个,但出现了错误:“ERROR: Could not build wheels for pymssql, which is required to install pyproject.toml-based projects”。 - Tobias Funke
确实,ODBC驱动程序尚未在M1 Mac上得到支持。这是否已不再是真的? - jtlz2
链接已修复!抱歉。 - johannstark
显示剩余2条评论

2

我在我的 M1 2020 Big Sur 上尝试了一下,它可以工作。

brew install unixodbc
export LDFLAGS="-L/opt/homebrew/Cellar/unixodbc/2.3.9/lib"
export CPPFLAGS="-I/opt/homebrew/Cellar/unixodbc/2.3.9/include"

如果您正在使用PyCharm,请确保正确设置了LDFLAGS和CPPFLAGS。


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