Pyodbc无法连接到数据库。

4

我正在使用来自这里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个实例和这样的数据库(.mdf) enter image description here enter image description here

正如您所看到的,只有1个引擎:

enter image description here

选择该引擎将允许我查看online_banking数据库 enter image description here

更新1 数据库是这样创建的:

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
更新2:我使用了内置工具sqlcmd。 因此,这个sqlcmd -S (LocalDB)\MSSQLLocalDB -i C:\Users\1.sql -E已经显示,MSSQLLocalDB中没有我的数据库。
然而,sqlcmd -S localhost -i C:\Users\1.sql -E成功执行。 我完全困惑了,我只安装了一个服务器,而且SQL管理工具只看到一个名为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)'

更新3: 指定的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 我尝试了这里的简单代码,以查看“online_banking”是否显示在该实例的数据库列表中。 但是遇到了另一个错误:

pyodbc.Error:('08001','[08001] [Microsoft] [SQL Server Native Client 11.0] \ - 不可读错误

此外,根据SSMS,enter image description here该数据库似乎已由online_banking数据库附加。


2
SQL Server LocalDB可以拥有任意数量的命名实例。尝试在此处测试代码[http://pastebin.com/pZGxXiDH],看看"online_banking"是否出现在数据库列表中。 - Gord Thompson
1
从.mdf文件的路径来看,online_banking数据库是在名为SQLSERVERINSAF的“常规”(而不是“LocalDB”)SQL Server实例中创建的。尝试使用此处的示例代码(http://pastebin.com/nJr4Pdge)查看“online_banking”是否显示在*该*实例的数据库列表中。如果没有,请在SQL Server Management Studio(SSMS)中打开(local)\SQLSERVERINSAF附加它。 - Gord Thompson
2
启动SQL Server Browser服务。启动SQL Server管理工具。在“连接到服务器”对话框中,单击“服务器名称”下拉菜单并选择“<浏览更多...>”(截图)。在“浏览服务器”对话框的“本地服务器”选项卡中,单击“数据库引擎”旁边的“+”号。这应该会显示出一个本地服务器实例列表。我的看起来像是这样。请编辑你的问题并展示出你的列表。 - Gord Thompson
1
太棒了!现在尝试使用此处的测试代码,看看是否可以连接。 - Gord Thompson
1
@GordThompson 这真是太神奇了)) 它的工作方式就像应该的那样。我只是插入了一些值,非常感谢你。别忘了发布一些答案以获得50分)) - Rocketq
显示剩余23条评论
2个回答

14

事实证明,涉及的数据库已经附加到本地计算机上的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“默认实例”的名称是什么?

答案:它没有名称。

当通过名称引用 SQL Server 实例时,默认实例只使用计算机的名称,而命名实例则通过 计算机名称\实例名称 进行标识。 因此,在名为 PANORAMA 的服务器上:

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

如果我们正在引用本地机器上的 SQL Server 实例,则可以使用 (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


最好在多用户部署时使用机器名称而不是本地名称。 - RoMEoMusTDiE

0

这可能是一个安全问题。您正在使用集成安全性,因此它将使用客户端程序运行的Windows登录的安全凭据。如果该用户或用户所属的组没有至少对数据库的公共访问权限,则会出现数据库不存在的情况。请确保用户或用户所属的组设置了登录并且至少具有对您的数据库的公共访问权限,或者使用SQL Server身份验证并在连接字符串中发送用户名和密码。


我不认为这个问题与访问权限有关。我的电脑只有一个账户,就是我,而且我是管理员。或者我应该以管理员身份运行PyCharm吗? - Rocketq

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接