【问题标题】:pyodbc can't connect to databasepyodbc 无法连接到数据库
【发布时间】:2015-12-13 08:31:08
【问题描述】:

我正在使用来自herepyodbc 库,并且我是这样连接的:

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 db

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\1.sql -E 已经表明, MSSQLLocalDB 没有我的数据库。

但是sqlcmd -S localhost -i C:\Users\1.sql -E 执行成功。 我完全糊涂了,我只安装了一台服务器,而且 SQL Management Studio 只看到一台本地服务器和我的online_banking DB。这对我来说真的很奇怪。

尝试在 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.

我发现,这可能与已经附加了这个数据库的父服务器有关,但未能解决这个问题。

更新4 我尝试了来自here 的简单代码,以查看“online_banking”是否出现在该实例的数据库列表中。但遇到另一个错误:

pyodbc.Error: ('08001', '[08001] [Microsoft][SQL Server Native Client 11.0]\ - 无法读取的错误

此外,根据 SSMS 的数据库 似乎已经由 online_banking DB 附加

【问题讨论】:

  • SQL Server LocalDB 可以有任意数量的命名实例。试试测试代码here,看看“online_banking”是否出现在数据库列表中。
  • 从 .mdf 文件的路径来看,online_banking 数据库似乎是在名为 SQLSERVERINSAF 的“常规”(而非“LocalDB”)SQL Server 实例中创建的。尝试示例代码here 以查看“online_banking”是否出现在 that 实例的数据库列表中。如果没有,则在 SQL Server Management Studio (SSMS) 中打开 (local)\SQLSERVERINSAFAttach
  • 启动 SQL Server Browser 服务。启动 SQL Server 管理工作室。在“连接到服务器”对话框中,单击“服务器名称”下拉菜单并选择“”(screenshot)。在“浏览服务器”对话框的“本地服务器”选项卡上,单击“数据库引擎”旁边的“+”。这应该会向您显示本地服务器实例的列表。我的看起来像this。请edit你的问题展示你的问题。
  • 太棒了!现在试试测试代码here,看看能不能连接。
  • @GordThompson 这太神奇了))工作正常。我刚刚插入了值,非常感谢。并且不要忘记发布 smth 作为答案以获得 50 分))

标签: python sql-server python-2.7 connection-string pyodbc


【解决方案1】:

事实证明,有问题的数据库已经附加到本地计算机上的默认 SQL Server 实例,所以只需要连接就可以了

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 Server“默认实例”的名称是什么?

A:没有。

当通过名称引用 SQL Server 实例时,默认实例只是简单地按机器名称,而 命名实例MachineName\InstanceName 标识。所以,在一个名为PANORAMA的服务器上

  • 如果我们安装 SQL Server 的“默认实例”,我们将其称为 PANORAMA
  • 如果我们安装一个名为“SQLEXPRESS”的“命名实例”,我们将其称为PANORAMA\SQLEXPRESS

如果我们指的是本地计算机上的 SQL 服务器实例,我们可以使用 (local) 而不是 PANORAMA

问:(local) 和 (localdb) 意思一样吗?

答:没有。

(local)(local)\InstanceName 指的是“真实的”基于服务器的 SQL Server 实例。这些是自 SQL Server 首次发布以来一直存在的实例。它们作为服务运行,能够接受网络连接并执行我们期望数据库服务器执行的所有操作。

(localdb)(localdb)\InstanceName 引用——为了清楚起见,(localdb) 通常大写为(LocalDB)——用于连接到“SQL Server LocalDB”实例。这些是主要供开发人员使用的临时本地 SQL Server 实例。有关详细信息,请参阅以下 MSDN 博客文章:

SQL Express v LocalDB v SQL Compact Edition

【讨论】:

  • 理想情况下,如果为多用户部署,您应该使用本地机器名称而不是本地名称。
【解决方案2】:

这可能是一个安全问题。您正在使用集成安全性,因此它将使用客户端程序正在运行的 Windows 登录的安全凭据。如果该用户或该用户所属的组至少没有对数据库的公共访问权限,则它将看起来好像该数据库不存在。确保用户或用户所属的组是set up with a login 并且至少具有public access to your database,或者使用 SQL 服务器身份验证并在连接字符串中发送用户名和密码。

【讨论】:

  • 我认为该问题与访问问题无关。我的电脑只有一个帐户,它是我,我是管理员。还是我应该以管理员身份运行 PyCharm?
猜你喜欢
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
  • 2021-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多