我可以使用以下代码连接到SQL服务器:
import sqlalchemy as sa
import urllib
params = urllib.parse.quote_plus("DRIVER={SQL Server Native Client 11.0};"
"SERVER=serv;"
"DATABASE=db1;"
"Trusted_Connection=yes")
engine = sa.create_engine("mssql+pyodbc:///?odbc_connect={}".format(params))
它是一个公司服务器,我们有许多数据库,例如db1、db2等。问题是,当我从数据库中查询表名时,使用以下方法:
inspector = sa.inspect(engine)
print(inspector.get_table_names())
它并不是在所有情况下都有效,即它为db1返回表名,但为db2返回一个空列表,尽管该数据库中有表。
我无法理解这种行为,它显示没有错误,意味着连接成功,那么为什么它不能显示表名呢?
事实证明,对于我无法检索任何表的数据库,默认模式(inspector.default_schema_name
(设置为我的Windows用户名,而不是dbo。这就是为什么它找不到任何桌子的原因。
将所需的架构作为参数传递可以解决问题。
inspector = sa.inspect(engine)
print(inspector.get_table_names(schema='dbo'))
尽管这解决了问题,但我仍然不知道为什么有些数据库的默认架构设置为dbo,而另一些数据库的默认模式设置为Windows用户名。