使用pyodbc和sqlalchemy连接到SQL server,不能使用“使用数据库名称”

2024-05-18 08:45:21 发布

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

我的代码如下:

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()

然后出现错误“此结果对象不返回行。它已自动关闭。”

enter image description here

但随后我删除了“使用大师”,它就起作用了:

enter image description here

enter image description here

因为我有很多数据库,所以我必须使用“使用数据库名”。有什么想法吗


Tags: importmastertruesqlserversqlalchemysessionconnect
1条回答
网友
1楼 · 发布于 2024-05-18 08:45:21

您正面临GitHubhere上讨论的问题

现在,您需要分别执行USE ...,然后执行查询。例如:

with engine.begin() as conn:
    db_name = conn.execute(text("SELECT DB_NAME()")).fetchone()[0]
    print(f'Current database: {db_name}')  # Current database: myDb
    tables = conn.execute(text("SELECT TOP 3 name FROM sys.tables ORDER BY name")).fetchall()
    print(tables)  # [('MillionRows',), ('myTable',), ('person',)]
    conn.execute(text("USE master"))
    db_name = conn.execute(text("SELECT DB_NAME()")).fetchone()[0]
    print(f'Current database: {db_name}')  # Current database: master
    tables = conn.execute(text("SELECT TOP 3 name FROM sys.tables ORDER BY name")).fetchall()
    print(tables)  # [('MSreplication_options',), ('spt_fallback_db',), ('spt_fallback_dev',)]

相关问题 更多 >