SQLAlchemy 无法自动加载 mssql 临时表

Kev*_*ire 4 python sql-server sqlalchemy pyodbc pandas

我无法连接到使用 SQLAlchemy 在 SQL 服务器上创建的临时表。

我连接到服务器:

engine = create_engine(URL, poolclass=StaticPool)
Run Code Online (Sandbox Code Playgroud)

我用来自熊猫数据帧的数据填充临时表:

df_tmp.to_sql('#table_test', con=engine)
Run Code Online (Sandbox Code Playgroud)

该表存在于服务器上:

res = engine.execute('SELECT * FROM tempdb..#table_test')
print(res)
Run Code Online (Sandbox Code Playgroud)

它返回我的数据元组列表。但是当我尝试创建一个 SQLAlchemy 表时,它失败了NoSuchTableError

from sqlalchemy import create_engine, MetaData, Table
metadata = MetaData(engine)
metadata.create_all()
table = Table('#table_test', metadata, autoload=True, autoload_with=engine)
Run Code Online (Sandbox Code Playgroud)

我也试过这个,它给出了同样的错误:

table = Table('tempdb..#table_test', metadata, autoload=True, autoload_with=engine)
Run Code Online (Sandbox Code Playgroud)

而且我还尝试使用 SQL 命令创建一个空白表,当我尝试使用 SQLAlchemy 读取它时会出现相同的错误:

engine.execute('CREATE TABLE #table_test (id_number INT, name TEXT)')
Run Code Online (Sandbox Code Playgroud)

SQLAlchemy 是否支持临时表?如果是这样,这里出了什么问题?如果可能,我希望将临时表作为 sqlalchemy.schema.Table 对象,因为它适合我的所有其他代码。

Gor*_*son 5

(回复:对问题的评论)

实际上,这是 SQLAlchemymssql方言检查表是否存在的当前机制的限制。它查询INFORMATION_SCHEMA.TABLES当前目录(数据库),并且#temp表不会出现在该视图中。如果我们USE tempdb然后INFORMATION_SCHEMA.TABLES从那里查询,它们确实会出现 - 以一种时尚,并以一种不是特别有用的方式出现。

现在,我在这里创建了一个 GitHub 问题,看看我们是否可以改进。

更新 2020-09-01

上述 GitHub 问题的更改已合并到 SQLAlchemy 的 master 分支中,并将包含在 1.4 版本中。如果您想在 1.4 正式发布之前利用此功能,您可以通过以下方式安装 SQLAlchemy

pip 安装 git+https://github.com/sqlalchemy/sqlalchemy.git