我正在使用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个引擎:
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
数据库的本地服务器。这看起来很奇怪。
尝试在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] \ - 无法读取的错误
答案 0 :(得分:8)
事实证明,有问题的数据库已经附加到本地计算机上的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实例时,默认实例只是按机器名称,而命名实例由{{1}标识}。因此,在名为MachineName\InstanceName
PANORAMA
。PANORAMA
。如果我们在本地计算机上引用SQL Server实例,我们可以使用PANORAMA\SQLEXPRESS
而不是(local)
。
答:没有。
PANORAMA
和(local)
指的是基于服务器的“真实”SQL Server实例。这些是自SQL Server首次发布以来一直存在的实例。它们作为服务运行,能够接受网络连接并完成我们期望数据库服务器执行的所有操作。
(local)\InstanceName
和(localdb)
引用 - (localdb)\InstanceName
通常大写为(localdb)
- 用于连接到“SQL Server LocalDB”实例。这些是主要供开发人员使用的临时本地SQL Server实例。有关详细信息,请参阅以下MSDN博客文章:
答案 1 :(得分:0)
这可能是一个安全问题。您正在使用集成安全性,因此它将使用客户端程序正在运行的Windows登录的安全凭据。如果该用户或该用户所属的组至少没有对数据库的公共访问权限,则它看起来好像数据库不存在。确保用户或用户所属的组是set up with a login并且至少具有public access to your database,或者使用SQL Server身份验证并在连接字符串中发送用户名和密码。< / p>