47

我正在尝试在 Python 3.3(Windows 7-64 位)上使用 SQLAlchemy(带有 pyodbc)连接到 SQL Server 2012 数据库。我可以使用直接 pyodbc 进行连接,但使用 SQLAlchemy 连接失败。我有用于数据库访问的 dsn 文件设置。

我像这样使用直接 pyodbc 成功连接:

con = pyodbc.connect('FILEDSN=c:\\users\\me\\mydbserver.dsn')

对于 sqlalchemy,我尝试过:

import sqlalchemy as sa
engine = sa.create_engine('mssql+pyodbc://c/users/me/mydbserver.dsn/mydbname')

create_engine方法实际上并没有建立连接并成功,但是如果我尝试一些导致 sqlalchemy 实际建立连接的方法(如engine.table_names()),它需要一段时间但随后返回此错误:

DBAPIError: (Error) ('08001', '[08001] [Microsoft][ODBC SQL Server Driver][DBNETLIB]SQL Server does not exist or access denied. (17) (SQLDriverConnect)') None None

我不确定哪里出了问题,如何查看 sqlalchemy 实际将什么连接字符串传递给 pyodbc。我已经成功地将相同的 sqlalchemy 类与 SQLite 和 MySQL 一起使用。

提前致谢!

4

6 回答 6

58

SQLAlchemy 将基于文件的 DSN 字符串解释为 server name = c, database name = users

我更喜欢在不使用 DSN 的情况下进行连接,这是在代码迁移期间处理的一项较少的配置任务。

此语法使用 Windows 身份验证工作:

engine = sa.create_engine('mssql+pyodbc://server/database')

或使用 SQL 身份验证:

engine = sa.create_engine('mssql+pyodbc://user:password@server/database')

SQLAlchemy在此处对不同的连接字符串选项进行了详尽的解释。

于 2013-04-01T20:08:22.140 回答
36

在 Python 3 中,您可以使用quote_plus模块中的函数urllib.parse来创建连接参数:

import urllib
params = urllib.parse.quote_plus("DRIVER={SQL Server Native Client 11.0};"
                                 "SERVER=dagger;"
                                 "DATABASE=test;"
                                 "UID=user;"
                                 "PWD=password")

engine = sa.create_engine("mssql+pyodbc:///?odbc_connect={}".format(params))

为了使用 Windows 身份验证,您需要使用Trusted_Connection作为参数:

params = urllib.parse.quote_plus("DRIVER={SQL Server Native Client 11.0};"
                                 "SERVER=dagger;"
                                 "DATABASE=test;"
                                 "Trusted_Connection=yes")

在 Python 2 中,您应该使用quote_plus库中的函数urllib

params = urllib.quote_plus("DRIVER={SQL Server Native Client 11.0};"
                           "SERVER=dagger;"
                           "DATABASE=test;"
                           "UID=user;"
                           "PWD=password")
于 2018-03-18T01:03:12.063 回答
27

我有关于在不使用 DSN 和使用 Windows 身份验证的情况下连接到 MSSQL Server 的更新信息。在我的示例中,我有下一个选项:我的本地服务器名称是“(localdb)\ProjectsV12”。我从数据库属性中看到的本地服务器名称(我使用的是 Windows 10 / Visual Studio 2015)。我的数据库名称是“MainTest1”

engine = create_engine('mssql+pyodbc://(localdb)\ProjectsV12/MainTest1?driver=SQL+Server+Native+Client+11.0', echo=True)

连接时需要指定驱动程序。您可以在以下位置找到您的客户端版本:

控制面板>系统和安全>管理工具。>ODBC 数据源>系统 DSN 选项卡>添加

从列表中查看 SQL Native 客户端版本。

于 2016-04-20T14:42:29.863 回答
7

只想在此处添加一些最新信息:如果您使用 DSN 连接进行连接:

engine = create_engine("mssql+pyodbc://USERNAME:PASSWORD@SOME_DSN")

如果您使用主机名连接进行连接:

engine = create_engine("mssql+pyodbc://USERNAME:PASSWORD@HOST_IP:PORT/DATABASENAME?driver=SQL+Server+Native+Client+11.0")

更多详情请参考“官方文档”

于 2018-03-27T18:28:09.730 回答
1
import pyodbc 
import sqlalchemy as sa
engine = sa.create_engine('mssql+pyodbc://ServerName/DatabaseName?driver=SQL+Server+Native+Client+11.0',echo = True)

这适用于 Windows 身份验证。

于 2021-04-20T19:10:47.790 回答
0

我做了不同的事情,像一个魅力一样工作。

首先导入库:

import pandas as pd
from sqlalchemy import create_engine
import pyodbc

创建一个函数来创建引擎

def mssql_engine(user = os.getenv('user'), password = os.getenv('password')
                 ,host = os.getenv('SERVER_ADDRESS'),db = os.getenv('DATABASE')):
    engine = create_engine(f'mssql+pyodbc://{user}:{password}@{host}/{db}?driver=SQL+Server')
    return engine

使用您的查询创建一个变量

query = 'SELECT * FROM [Orders]'

执行 Pandas 命令从 MSSQL 表创建数据框

df = pd.read_sql(query, mssql_engine())
于 2020-04-09T04:10:52.183 回答