pyodbc 无法连接到数据库
pyodbc can't connect to database
我正在使用来自 here 的 pyodbc
库,并且我是这样连接的:
conn = pyodbc.connect(r'DRIVER={SQL Server Native Client 11.0};Server=(localdb)\MSSQLLocalDB;Integrated Security=true; database = online_banking; autocommit = True')
我使用 MSSQLLocalDB
因为它是 SQL Server 2014 的默认实例名称。这是 Python 2.7.
的最后一个版本
但是我不能运行任何简单的查询,如果他们提出错误,说没有这样的对象或在特定情况下数据库:
cursor.execute('use online_banking;')
完整错误:
pyodbc.Error: ('08004', "[08004] [Microsoft][SQL Server Native Client 11.0][SQL Server]Database 'online_banking' does not exist. Make sure that the name is entered correctly. (911) (SQLExecDirectW)")
那么这里出了什么问题?
只安装了 1 个实例 databases(.mdf)
如您所见,只有 1 个引擎:
选择该引擎将使我能够看到 online_banking
数据库
upd1 数据库是这样创建的:
CREATE DATABASE [online_banking]
ON PRIMARY
( NAME = N'online_banking', FILENAME = N'C:\...\online_banking.mdf' ,
SIZE = 512000KB , MAXSIZE = UNLIMITED, FILEGROWTH = 30%)
LOG ON
( NAME = N'online_banking_log', FILENAME = N'C:\...\online_banking_log.ldf' ,
SIZE = 1024KB , MAXSIZE = 20GB , FILEGROWTH = 10%)
GO
upd2 我使用了内置工具 sqlcmd
。
所以这个 sqlcmd -S (LocalDB)\MSSQLLocalDB -i C:\Users.sql -E
表明,
MSSQLLocalDB
没有我的数据库。
然而 sqlcmd -S localhost -i C:\Users.sql -E
执行成功。
我完全糊涂了,我只安装了一台服务器,而且 SQL Management studio 只看到一台本地服务器和我的 online_banking
数据库。这对我来说真的很奇怪。
正在尝试在 Python
中使用此连接字符串
conn = pyodbc.connect(r'DRIVER={SQL Server Native Client 11.0};Server=localhost;Integrated Security=true; database = online_banking; autocommit = True')
导致以下错误:
pyodbc.Error: ('28000', '[28000] [Microsoft][SQL Server Native Client 11.0][SQL Server]\x... "". (18456) (SQLDriverConnect); [01S00] [Microsoft][SQL Server Native Client 11.0]\xcd\xe5\xe....xe8\xff (0); [28000] [Microsoft][SQL Server Native Client 11.0][SQL Server]\xce...ff "". (18456); [01S00] [Microsoft][SQL Server Native Client 11.0]\xcd\xe.... (0)'
upd3: 应该附上指定的 mdf,知道了:
尝试了几种方法,总是错误(在连接字符串中指定或不指定数据库):
conn = pyodbc.connect(
r'Driver={SQL Server Native Client 11.0};Server=(localdb)\MSSQLLocalDB; database =online_banking; AttachDbFilename=C:\Program Files\Microsoft SQL Server\MSSQL12.SQLSERVERINSAF\MSSQL\DATA\online_banking.mdf;Trusted_Connection=Yes; Integrated Security=true; database = online_banking;')
error: A database with the same name exists, or specified file cannot be opened, or it is located on UNC share.
我发现,这可能与已经附加此数据库的父服务器有关,但未能解决此问题。
upd4
我尝试了来自 here 的简单代码,以查看 "online_banking" 是否出现在该实例的数据库列表中。但遇到另一个错误:
pyodbc.Error: ('08001', '[08001] [Microsoft][SQL Server Native Client 11.0]\ - unreadable error
此外,根据 SSMS,数据库 似乎已经由 online_banking
DB
附加
这可能是一个安全问题。您正在使用集成安全性,因此它将使用客户端程序为 运行 的 windows 登录的安全凭证。如果该用户或该用户所属的组没有至少 public 访问数据库的权限,则该数据库将显示为不存在。确保用户或用户所属的组是 set up with a login and that it has at least public access to your database,或者使用 SQL 服务器身份验证并在连接字符串中发送用户名和密码。
事实证明,有问题的数据库已经附加到本地计算机上 SQL 服务器的默认实例,因此连接所需的只是
import pyodbc
conn_str = (
r"Driver={SQL Server Native Client 11.0};"
r"Server=(local);"
r"Database=online_banking;"
r"Trusted_Connection=yes;"
)
conn = pyodbc.connect(conn_str)
主要有两点混淆:
问:SQL 服务器 "default instance" 的名称是什么?
答:没有。
当按名称引用 SQL 服务器实例时, 默认实例 仅使用机器名称,而 命名实例 由 MachineName\InstanceName
标识。因此,在名为 PANORAMA
的服务器上
- 如果我们安装 SQL 服务器的 "default instance",我们将其称为
PANORAMA
。
- 如果我们安装一个名为 "SQLEXPRESS" 的 "named instance",我们将其称为
PANORAMA\SQLEXPRESS
。
如果我们指的是本地计算机上的 SQL 服务器实例,我们可以使用 (local)
而不是 PANORAMA
。
问:(local) 和 (localdb) 是同一个意思吗?
答:没有
(local)
和 (local)\InstanceName
指 "real" 基于服务器的 SQL 服务器实例。这些是自 SQL 服务器首次发布以来一直存在的实例。它们 运行 作为一项服务,能够接受网络连接并执行我们希望数据库服务器执行的所有操作。
(localdb)
和 (localdb)\InstanceName
引用——为了清楚起见,(localdb)
通常大写为 (LocalDB)
——用于连接到 "SQL Server LocalDB" 实例。这些是主要供开发人员使用的临时本地 SQL 服务器实例。有关详细信息,请参阅以下 MSDN 博客 post:
我正在使用来自 here 的 pyodbc
库,并且我是这样连接的:
conn = pyodbc.connect(r'DRIVER={SQL Server Native Client 11.0};Server=(localdb)\MSSQLLocalDB;Integrated Security=true; database = online_banking; autocommit = True')
我使用 MSSQLLocalDB
因为它是 SQL Server 2014 的默认实例名称。这是 Python 2.7.
但是我不能运行任何简单的查询,如果他们提出错误,说没有这样的对象或在特定情况下数据库:
cursor.execute('use online_banking;')
完整错误:
pyodbc.Error: ('08004', "[08004] [Microsoft][SQL Server Native Client 11.0][SQL Server]Database 'online_banking' does not exist. Make sure that the name is entered correctly. (911) (SQLExecDirectW)")
那么这里出了什么问题?
只安装了 1 个实例 databases(.mdf)
如您所见,只有 1 个引擎:
选择该引擎将使我能够看到 online_banking
数据库
upd1 数据库是这样创建的:
CREATE DATABASE [online_banking]
ON PRIMARY
( NAME = N'online_banking', FILENAME = N'C:\...\online_banking.mdf' ,
SIZE = 512000KB , MAXSIZE = UNLIMITED, FILEGROWTH = 30%)
LOG ON
( NAME = N'online_banking_log', FILENAME = N'C:\...\online_banking_log.ldf' ,
SIZE = 1024KB , MAXSIZE = 20GB , FILEGROWTH = 10%)
GO
upd2 我使用了内置工具 sqlcmd
。
所以这个 sqlcmd -S (LocalDB)\MSSQLLocalDB -i C:\Users.sql -E
表明,
MSSQLLocalDB
没有我的数据库。
然而 sqlcmd -S localhost -i C:\Users.sql -E
执行成功。
我完全糊涂了,我只安装了一台服务器,而且 SQL Management studio 只看到一台本地服务器和我的 online_banking
数据库。这对我来说真的很奇怪。
正在尝试在 Python
中使用此连接字符串conn = pyodbc.connect(r'DRIVER={SQL Server Native Client 11.0};Server=localhost;Integrated Security=true; database = online_banking; autocommit = True')
导致以下错误:
pyodbc.Error: ('28000', '[28000] [Microsoft][SQL Server Native Client 11.0][SQL Server]\x... "". (18456) (SQLDriverConnect); [01S00] [Microsoft][SQL Server Native Client 11.0]\xcd\xe5\xe....xe8\xff (0); [28000] [Microsoft][SQL Server Native Client 11.0][SQL Server]\xce...ff "". (18456); [01S00] [Microsoft][SQL Server Native Client 11.0]\xcd\xe.... (0)'
upd3: 应该附上指定的 mdf,知道了: 尝试了几种方法,总是错误(在连接字符串中指定或不指定数据库):
conn = pyodbc.connect(
r'Driver={SQL Server Native Client 11.0};Server=(localdb)\MSSQLLocalDB; database =online_banking; AttachDbFilename=C:\Program Files\Microsoft SQL Server\MSSQL12.SQLSERVERINSAF\MSSQL\DATA\online_banking.mdf;Trusted_Connection=Yes; Integrated Security=true; database = online_banking;')
error: A database with the same name exists, or specified file cannot be opened, or it is located on UNC share.
我发现,这可能与已经附加此数据库的父服务器有关,但未能解决此问题。
upd4 我尝试了来自 here 的简单代码,以查看 "online_banking" 是否出现在该实例的数据库列表中。但遇到另一个错误:
pyodbc.Error: ('08001', '[08001] [Microsoft][SQL Server Native Client 11.0]\ - unreadable error
此外,根据 SSMS,数据库 online_banking
DB
这可能是一个安全问题。您正在使用集成安全性,因此它将使用客户端程序为 运行 的 windows 登录的安全凭证。如果该用户或该用户所属的组没有至少 public 访问数据库的权限,则该数据库将显示为不存在。确保用户或用户所属的组是 set up with a login and that it has at least public access to your database,或者使用 SQL 服务器身份验证并在连接字符串中发送用户名和密码。
事实证明,有问题的数据库已经附加到本地计算机上 SQL 服务器的默认实例,因此连接所需的只是
import pyodbc
conn_str = (
r"Driver={SQL Server Native Client 11.0};"
r"Server=(local);"
r"Database=online_banking;"
r"Trusted_Connection=yes;"
)
conn = pyodbc.connect(conn_str)
主要有两点混淆:
问:SQL 服务器 "default instance" 的名称是什么?
答:没有。
当按名称引用 SQL 服务器实例时, 默认实例 仅使用机器名称,而 命名实例 由 MachineName\InstanceName
标识。因此,在名为 PANORAMA
- 如果我们安装 SQL 服务器的 "default instance",我们将其称为
PANORAMA
。 - 如果我们安装一个名为 "SQLEXPRESS" 的 "named instance",我们将其称为
PANORAMA\SQLEXPRESS
。
如果我们指的是本地计算机上的 SQL 服务器实例,我们可以使用 (local)
而不是 PANORAMA
。
问:(local) 和 (localdb) 是同一个意思吗?
答:没有
(local)
和 (local)\InstanceName
指 "real" 基于服务器的 SQL 服务器实例。这些是自 SQL 服务器首次发布以来一直存在的实例。它们 运行 作为一项服务,能够接受网络连接并执行我们希望数据库服务器执行的所有操作。
(localdb)
和 (localdb)\InstanceName
引用——为了清楚起见,(localdb)
通常大写为 (LocalDB)
——用于连接到 "SQL Server LocalDB" 实例。这些是主要供开发人员使用的临时本地 SQL 服务器实例。有关详细信息,请参阅以下 MSDN 博客 post: