M1 Mac 上的 Pyodbc

Posted

技术标签:

【中文标题】M1 Mac 上的 Pyodbc【英文标题】:Pyodbc on M1 Macs 【发布时间】:2021-03-31 22:22:02 【问题描述】:

我正在尝试使用 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.iniodbc.ini。他们似乎在opt/homebrew/Cellar/

我非常感谢您对此的帮助。

【问题讨论】:

根据Install the Microsoft ODBC driver for SQL Server (macOS):仅 x64 架构支持 macOS 上 SQL Server 的 Microsoft ODBC 驱动程序。不支持 Apple M1。 也许在他们支持之前尝试 FreeTDS? @AlwaysLearning 这实际上是错误的。官方页面说“...仅支持 x64 架构到 17.7 版。Apple M1 (ARM64) 支持从 17.8 版开始添加...” @gmarais,引用在一年前写的时候是正确的。直到四个月后,微软才在July 2021 发布了适用于 SQL Server 的 ODBC 驱动程序 17.8。 【参考方案1】:

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 到更多细节。

【讨论】:

谢谢!是的,它适用于 pymssql 请注意,您也可以将 FreeTDS 与 pyodbc 一起使用。但是您使用 pymssql 的示例也不错!【参考方案2】:

更新:

您实际上可以在容器中使用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 撰写:

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://***.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://docs.microsoft.com/en-us/sql/connect/python/pymssql/step-1-configure-development-environment-for-pymssql-python-development?view=sql-server-ver15

https://pymssql.readthedocs.io/en/stable/pymssql_examples.html

【讨论】:

如果使用 amd64 容器,性能会受到影响。使用 FreeTDS 可能会更好。【参考方案3】:

我在我的 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 设置正确

【讨论】:

以上是关于M1 Mac 上的 Pyodbc的主要内容,如果未能解决你的问题,请参考以下文章

M1 mac 上的 Android 平台工具

M1苹果硅mac上的Dynamodb本地设置

Docker-compose 在 M1 mac 上的 VM (Parallels) 中

M1 Mac 上的 Pod 安装错误 - 使用 shared_preferences 等本机代码的 Flutter 项目

M1 mac 上的 android studio 和 manager 错误(未安装模拟器)

带有 Big Sur 的基于 ARM 的 M1 Mac 上的 Postgres 错误