提问人:wholt 提问时间:11/12/2023 更新时间:11/14/2023 访问量:75
在 M1 mac 上使用 Python 中的 SQLAlchemy 连接到 Azure 数据库
Connecting to an Azure database using SQLAlchemy in Python on M1 mac
问:
我正在尝试连接到 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 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)
这将成功连接到数据库,而不会出现任何错误。
关于以下错误:
(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
这可能会解决该问题。有关更多信息,您可以参考此内容。
评论
我设法为我的问题找到了解决方法。谢谢大家的帮助!
我无法让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
评论
brew list msodbcsql18
URL.create('mssql+pyodbc', ...)