1

我正在尝试使用 SQLAlchemy 和 pymssql 在远程 MSSQL 数据库中执行 TSQL 查询。我已经直接在数据库中测试了我的程序查询,它按预期工作,如果我直接通过 pymssql 运行它,它也可以工作。如果我运行常规的单行查询,例如:

select table_name from INFORMATION_SCHEMA.tables

通过 SQLAlchemy,这也可以正常工作。但是当我尝试执行以下 TSQL 查询时,它实际上并没有创建表:

IF NOT EXISTS (SELECT * 
    FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_NAME = 'SOME_TABLE')
BEGIN
   CREATE TABLE SOME_TABLE (SOME_TEXT VARCHAR(255), SOME_TIME DATETIME)
END

它在成功时运行它,如果我尝试从执行中读取结果,它会按预期给我“资源已关闭错误”,因为它是一个 CREATE 查询。但是,如果我尝试将数据添加到表“SOME_TABLE”中,它会向我呕吐并说该表不存在。感觉它只是将查询作为函数上传,但从不执行它。有任何想法吗?甚至更好;使用 SQLAlchemy 和 pymssql 执行时实际工作的 TSQL 查询。

谢谢,

4

2 回答 2

2

您需要在 Session 中提交待处理的更改。有关该过程的基本了解,请阅读使用会话。快速解决方案:

session.commit()
于 2013-09-05T11:56:22.217 回答
0

TIME 和 TEXT 是保留字。

我不知道 SQL Alchemy 或 pymmsql 如何与 SQL Server 对话。本机客户端或 ODBC。最终,这一切都归结为基于 TCP/IP 等网络协议的表格数据流 (TDS)。

查看TECHNET上的保留词列表。

-- Create table ?
IF OBJECT_ID('DBO.SOMETABLE') IS NULL 
  CREATE TABLE DBO.SOMETABLE (MY_TEXT VARCHAR(255), MY_TIME DATETIME);

我使用 OBJECT_ID 函数,因为它的输入更少。

但 NOT EXITS 适用于 SELECT FROM sys.objects 或 information_schema.tables 以及正确的 WHERE 子句。

于 2013-09-04T01:07:06.833 回答