【问题标题】:SQL Server Query Won't Commit Using SQLAlchemy EngineSQL Server 查询不会使用 SQLAlchemy 引擎提交
【发布时间】:2016-05-27 20:42:56
【问题描述】:

我有一个将数据写入 SQL Server 数据库的进程。除了一个不会提交任何数据的查询之外,所有查询都正常运行。未提交的代码如下:

import sqlalchemy as sa
from urllib.parse import quote_plus    

connection_parameters = "DRIVER={SQL SERVER};SERVER={server};" \
                        "DATABASE={Database};TRUSTED_CONNECTION=YES"
formatted_string = quote_plus(connection_parameters)
connection_string = "mssql+pyodbc:///?odbc_connect={0}".format(formatted_string)
engine = sa.create_engine(connection_string, poolclass=sa.pool.NullPool, echo=True)

sql = ("BEGIN\n"
       "    IF NOT EXISTS (\n"
       "            SELECT [id]\n"
       "            FROM [dbo].[Items]\n"
       "            WHERE [id] = ?\n"
       "            )\n"
       "        INSERT INTO [dbo].[Items] (\n"
       "            [id]\n"
       "            ,[name]\n"
       "            )\n"
       "        VALUES (\n"
       "            ?\n"
       "            ,?\n"
       "            )\n"
       "END")

parameters = (self.identifier, self.identifier, self.title)
with engine.connect() as connection:
    connection.execute(sql, parameters)

查看日志的输出,我看不出这些行不会被插入的任何原因。

2016-02-16 08:54:23,288 INFO sqlalchemy.engine.base.Engine BEGIN
IF NOT EXISTS (
        SELECT [id]
        FROM [dbo].[Items]
        WHERE [id] = ?
        )
    INSERT INTO [dbo].[Items] (
        [id]
        ,[Title]
        )
    VALUES (
        ?
        ,?
        )
END
2016-02-16 08:54:23,288 INFO sqlalchemy.engine.base.Engine ('0262018020', '0262018020', 
'Machine Learning: A Probabilistic Perspective')

【问题讨论】:

  • 我建议将您的 t-sql 移动到存储过程。它为您提供了数据层的分离,并且更容易编写和调试您的 sql。
  • id在数据库中是什么类型?您的字符串是否有可能在转换为整数时丢失了前导零?我对您的客户端堆栈了解不足,无法确切了解其中发生了什么......
  • 列类型为CHAR(10)。该表完全是空的。

标签: python sql-server python-3.x sqlalchemy


【解决方案1】:

尝试编写存储过程。尝试使用MERGE 语句。引擎只是不会写入数据。使用pyodbc 连接对象有效。

【讨论】:

    猜你喜欢
    • 2020-03-10
    • 2017-06-24
    • 2021-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-25
    • 1970-01-01
    相关资源
    最近更新 更多