pyodbc无法连接到数据库

2024-05-23 21:01:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用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的默认实例名。以及Python2.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)")

那这里怎么了?

只安装了一个实例,这样的databases(.mdf)enter image description hereenter image description here

如您所见,只有一台发动机:

enter image description here

选择那个引擎会让我看到online_bankingdb enter image description here

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_bankingDB。我觉得这很奇怪。

尝试在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:应附加指定的中密度纤维板,得到: 尝试了多种方法,总是出现错误(数据库指定或不在连接字符串中):

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中的简单代码,以查看“在线银行”是否显示在该实例的数据库列表中。但面临另一个错误:

pyodbc.Error: ('08001', '[08001] [Microsoft][SQL Server Native Client 11.0]\ - unreadable error

此外,根据SSMS,数据库enter image description here似乎已经附加了online_bankingDB


Tags: client数据库sqlserverconnect错误conndatabase
2条回答

事实证明,所讨论的数据库已经附加到本地计算机上的默认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)

有两个主要的混乱点:

Q: SQL Server“默认实例”的名称是什么?

A:没有。

按名称引用SQL Server实例时,默认实例仅按计算机的名称进行,而命名实例由MachineName\InstanceName标识。所以,在名为PANORAMA的服务器上

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

如果我们引用的是本地计算机上的SQL server实例,则可以使用(local),而不是PANORAMA

Q: (local)和(localdb)是同一个意思吗?

A:没有

(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

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

相关问题 更多 >