【发布时间】:2021-07-28 07:08:42
【问题描述】:
我的代码如下:
import urllib
import sqlalchemy
from sqlalchemy.orm import sessionmaker, scoped_session
def list_dbs():
sql = """
use master;
SELECT name
FROM sys.databases;
"""
try:
odbc_connect = "DRIVER={SQL Server};Server=localhost;Database=master;port=1433"
engine = sqlalchemy.create_engine("mssql+pyodbc:///?odbc_connect=%s" % urllib.quote_plus(odbc_connect),
echo=True, connect_args={'autocommit': True})
SessionFactory = sessionmaker(bind=engine)
session = scoped_session(SessionFactory)
result = session.execute(sql)
for v in result:
print(v)
except Exception as e:
print(e)
list_dbs()
然后报错“这个结果对象没有返回行。它已经被自动关闭了。”
但后来我删除了“use master;”它有效:
因为我有很多数据库,所以我必须使用“use databasename”。有什么想法吗?
【问题讨论】:
-
如果您在
odbc_connect中定义要连接到(master) 的数据库,为什么您的SQL 中还需要USE master;?USE是多余的,因为您已经连接到正确的数据库。 -
您是否可以直接在服务器上运行您的 SQL 脚本。我试过了,它工作正常。这可能是驱动程序中的错误吗?
-
另外,任何 SQL Server 都只有一个
master数据库。您是在问如何列出每个数据库中的表而不是服务器上的数据库? -
我的实例上有多个数据库,我需要在同一个 SQL 中切换数据库。我已经在 SSMS 上验证了这个 SQL,它可以工作。
标签: sql-server pyodbc