使用 pyodbc 和 sqlalchemy 连接到 SQL 服务器,不能使用 "use database_name;"
Connect to SQL server using pyodbc and sqlalchemy, cannot use "use database_name;"
我的代码如下:
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()
然后报错"This result object does not return rows. It has been closed automatically."
但后来我删除了 "use master;",它起作用了:
因为我有很多数据库,所以我不得不使用"use databasename."有什么想法吗?
您面临 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',)]
我的代码如下:
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()
然后报错"This result object does not return rows. It has been closed automatically."
但后来我删除了 "use master;",它起作用了:
因为我有很多数据库,所以我不得不使用"use databasename."有什么想法吗?
您面临 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',)]