我知道这个问题在网上被问了很多次,导致了许多不同的解决方案,但没有一个对我有用。
对于我的场景,我尝试对 MS Sql 数据库进行简单连接,仅使用 Windows 身份验证与服务帐户用户名和密码进行连接,这不适合我的任务。
这是我提供的连接字符串:
databaseConnection = 'DRIVER={SQL Server}; SERVER=ServerName; Database=DatbaseName; UID=UserId; PWD=password;'
这是我在尝试运行脚本时收到的错误:
dbConnection = pyodbc.connect(DATABASE.databaseConnection)
pyodbc.ProgrammingError: ('42000', '[42000] [Microsoft][ODBC SQL Server Driver]
[SQL Server]Cannot open database "XXXX" requested by the login. The login failed.
(4060) (SQLDriverConnect); [42000] [Microsoft][ODBC SQL Server Driver]
[SQL Server]Cannot open database "XXXX" requested by the login. The login failed. (4060)')
这个连接字符串有什么不正确的地方吗?我通过将用户名和密码复制并粘贴到 SQL Server Management Studio 中并从那里登录到数据库来仔细检查用户名和密码,结果成功。
我自己也遇到过这个问题,我通过转到 Microsoft SQL Server 管理工作室并手动将数据库连接到您登录数据库的用户帐户来修复它。
要执行此操作:
当您看到它时,请查看底部的面板。如果显示
Database role membership for:{database name}
,请确保您已选中 db_datareader
和 db_datawriter
。
这是一种使用 sqlalchemy 获得连接字符串的方法(参见 https://www.sqlalchemy.org/):
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from db import Db
#Get localhost DB
engine = create_engine('mssql+pyodbc://myDbUser:myDbPassword@localhost:1433/MyDatabase?driver=SQL+Server+Native+Client+11.0?trusted_connection=no')
DBSession = sessionmaker(bind=engine)
session = DBSession()
db = Db(session)
print "the widget number is: "+db.widgetNumber
我遇到了同样的问题,问题是数据库名称。
我将数据库名称放在括号之间,例如 [DB_NAME],但是一旦我将括号删除为 DB_NAME,它就可以正常工作了。
请尝试一下。
在 obdc 数据源中配置 MSSQL 服务器,并使用 pyodbc 连接命名,如下所示。我的 userdsn 名称是 MyConnection
import pyodbc
cnxn = pyodbc.connect('DSN=MyConnection')
cursor = cnxn.cursor()
cursor.execute("SELECT TOP (1000) [DepartmentID] ,[Name] ,[GroupName] ,[ModifiedDate] FROM ["
"AdventureWorks2019].[HumanResources].[Department]")
rows = cursor.fetchall()
for row in rows:
print(row.DepartmentID, row.Name)
它对我有用。让我知道是否还有其他方法可以做到这一点。
重要的参数是设置“用户名和密码”的位置,我将其替换为“Trusted_Connection=yes”,以便使用登录到 Windows 的用户帐户。
import pyodbc
conn_str = ("Driver={SQL Server};"
"Server=<server-name>;"
"Database=<db-name>;"
"Trusted_Connection=yes")
conn = pyodbc.connect(conn_str)
cursor = conn.cursor()
我也遇到了类似的问题,问题是数据库名称。
我在数据库名称中添加了层次结构,例如“DB_NAME.dbo”,但是当我将其删除到 DB_NAME 后,它就工作正常了。