【发布时间】: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