在 M1 mac 上使用 Python 中的 SQLAlchemy 连接到 Azure 数据库

Connecting to an Azure database using SQLAlchemy in Python on M1 mac

提问人:wholt 提问时间:11/12/2023 更新时间:11/14/2023 访问量:75

问:

我正在尝试连接到 Azure SQL Server 数据库,但不断收到此错误:

(pyodbc.InterfaceError) ('IM002', '[IM002] [unixODBC][Driver Manager]Data source name not found and no default driver specified (0) (SQLDriverConnect)')

我正在使用此代码片段尝试连接:

params = urllib.parse.quote_plus
('Driver={ODBC Driver 18 for SQL Server};Server=tcp:test-server.database.windows.net,1433;Database=test-database;Uid=*****;Pwd=*****;Encrypt=yes;TrustServerCertificate=no;Connection Timeout=30;')
conn_str = 'mssql+pyodbc:///?odbc_connect={}'.format(params)
engine_azure = create_engine(conn_str,echo=True)
connection = engine_azure.connect()

我尝试将驱动程序更改为“SQL Server”和驱动程序文件路径“/opt/homebrew/lib/libmsodbcsql.18.dylib”。这些都没有奏效。

我能够使用 pyodbc.connect() 函数进行连接,因此我知道我的连接字符串是正确的。

在 /opt/homebrew/etc/ 文件夹中,我有空的 odbc.ini 文件和如下的 odbcinst.ini 文件:

[ODBC Driver 18 for SQL Server]
Description=Microsoft ODBC Driver 18 for SQL Server
Driver=/opt/homebrew/lib/libmsodbcsql.18.dylib
UsageCount=1

odbcinst -j 给出:

unixODBC 2.3.11
DRIVERS............: /etc/odbcinst.ini
SYSTEM DATA SOURCES: /etc/odbc.ini
FILE DATA SOURCES..: /etc/ODBCDataSources
USER DATA SOURCES..: /Users/wholt2/.odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8

我为 odbc.ini 和 odbcinst.ini 文件创建了从 /etc/ 文件夹到 /opt/homebrew/etc/ 文件夹的快捷方式。奇怪的是,ODBCDataSources 和 .odbc.ini 文件不存在。我尝试使用 卸载并重新安装驱动程序,但似乎没有任何效果。任何帮助将不胜感激。谢谢!brew install msodbcsql18 mssql-tools18

sql-server sqlalchemy azure-sql-database

评论

0赞 AlwaysLearning 11/12/2023
您是否确认已安装的文件路径(使用 )与您尝试编辑到 .ini 文件中的内容匹配?brew list msodbcsql18
0赞 AlwaysLearning 11/12/2023
您是否阅读过以编程方式创建 URL 并尝试改用?另请参阅使用 sqlalchemy.engine.url.URL 生成 mssql+pyodbc 的连接 URLURL.create('mssql+pyodbc', ...)

答:

1赞 Bhavani 11/13/2023 #1

可以尝试以下代码,使用 SQL Alchemy 连接到 Azure SQL 数据库:You can try the code to connect to an Azure SQL database with SQL Alchemy:

import urllib
import sqlalchemy
import pandas as pd

sql_query = 'SELECT * FROM [dbo].[<tableName>]'
server = '<serverName>.database.windows.net'
database = '<databaseName>'
username = '<userName>'
password = '<password>'
driver = '{ODBC Driver 17 for SQL Server}'
odbc_str = 'DRIVER='+driver+';SERVER='+server+';PORT=1433;UID='+username+';DATABASE='+ database + ';PWD='+ password
connect_str = 'mssql+pyodbc:///?odbc_connect=' + urllib.parse.quote_plus(odbc_str)
engine = sqlalchemy.create_engine(connect_str)
df = pd.read_sql(sql_query, engine)
print(df)

这将成功连接到数据库,而不会出现任何错误。

enter image description here

关于以下错误:

(pyodbc.InterfaceError) ('IM002', '[IM002] [unixODBC][Driver Manager]Data source name not found and no default driver specified (0) (SQLDriverConnect)')

检查 odbc.ini 和 odbcinst.ini 文件的位置。如果文件位于该位置,则将它们复制到 /etc/ 位置。使用以下命令复制文件:/usr/local/etc/

$ cp /usr/local/etc/odbc.ini /etc/odbc.ini  
$ cp /usr/local/etc/odbcinst.ini /etc/odbcinst.ini

这可能会解决该问题。有关更多信息,您可以参考内容。

评论

0赞 wholt 11/14/2023
我已经做到了这一切。它仍然不起作用。不过,谢谢你的帮助。
0赞 wholt 11/14/2023 #2

我设法为我的问题找到了解决方法。谢谢大家的帮助!

我无法让ODBC驱动程序工作。我认为那里有什么东西坏了。我通过使用PYMSSQL驱动程序解决了这个问题。

代码如下

import pymssql

engine_azure = create_engine("mssql+pymssql://username:password@server:port/database")

connection = engine_azure.connect()

为了让它工作,我不得不在终端中运行这些命令

brew install freetds openssl
export LDFLAGS="-L/opt/homebrew/opt/freetds/lib -L/opt/homebrew/opt/openssl@3/lib"
export CFLAGS="-I/opt/homebrew/opt/freetds/include"
export CPPFLAGS="-I/opt/homebrew/opt/openssl@3/include"
python -m pip install pymssql