【问题标题】:Connect to SQL server using pyodbc and sqlalchemy, cannot use "use database_name;"使用 pyodbc 和 sqlalchemy 连接到 SQL 服务器,不能使用“use database_name;”
【发布时间】: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


【解决方案1】:

您正面临 GitHub here 上讨论的问题。

就目前而言,您需要单独执行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',)]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-22
    • 2018-03-06
    • 2018-05-05
    • 1970-01-01
    • 2020-12-02
    • 2021-11-19
    • 2018-01-17
    相关资源
    最近更新 更多