當我用 sqlalchemy 插入多行時,我沒有得到插入的 id 值。
例如,當我在 MS SQL Server 中執行普通 SQL 時,它在結果集中顯示 2 行(我插入的 recs...1,2)。
INSERT INTO dbo.emp (id, fname, lname, dob)
OUTPUT inserted.id
VALUES (1, 'Test1','Rec1','01/01/1990'), (2, 'Test2','Rec2','01/01/1990')
當我使用下面的代碼在 sqlalchemy 中執行相同的查詢時,print 陳述句只顯示值 2(而不是 1)。看起來結果集插入了最后一行。下面的代碼有問題嗎?
try:
sql = """\
INSERT INTO dbo.emp (id, fname, lname, dob)
OUTPUT inserted.id
VALUES (:id, :fname, :lname, :dob)
"""
stmt = text(sql)
data = [
{'id': 1, 'fname':'Test1', 'lname':'rec1', 'dob':'05/05/2000'}
,{'id': 2, 'fname': 'Test2', 'lname': 'rec2', 'dob': '05/05/2001'}
]
result = conn.execute(stmt, data)
for id in result:
print(id)
conn.commit()
except exc.IntegrityError as e:
print('Code3 - Integrity error raised', e)
conn.rollback()
except exc.SQLAlchemyError as e:
print('Code3 - Something else went wrong', e)
conn.rollback()
uj5u.com熱心網友回復:
對于像字典串列這樣的多行引數資料,SQLAlchemy 使用 pyodbc 的.executemany()方法,該方法不適合從 OUTPUT 子句回傳多個結果。
如果您使用的是 SQL Server 2016 ,則可以使用OPENJSON并傳遞表示多行資料的單個字串來獲取結果:
import json
import sqlalchemy as sa
engine = sa.create_engine("mssql pyodbc://@mssqlLocal")
with engine.begin() as conn:
conn.exec_driver_sql("DROP TABLE IF EXISTS emp")
conn.exec_driver_sql(
"CREATE TABLE emp ("
"id int identity primary key, "
"fname nvarchar(50), "
"lname nvarchar(50)"
")"
)
sql = """\
INSERT INTO emp (fname, lname)
OUTPUT inserted.id
SELECT fname, lname FROM
OPENJSON(:json_str)
WITH (
fname nvarchar(50) '$.fname',
lname nvarchar(50) '$.lname'
)
"""
data = [
{"fname": "Homer", "lname": "Simpson"},
{"fname": "Ned", "lname": "Flanders"},
]
with engine.begin() as conn:
results = conn.execute(
sa.text(sql), {"json_str": json.dumps(data)}
).fetchall()
print(results) # [(1,), (2,)]
對于舊版本的 SQL Server,您可以將行資料上傳到臨時表,然后使用
INSERT INTO emp (fname, lname)
OUTPUT inserted.id
SELECT fname, lname FROM #temp_table
uj5u.com熱心網友回復:
我很確定 conn.execute 兩次運行插入命令。看,您的 sql 命令是一個資料行的插入,因此它不會轉換為:
INSERT INTO dbo.emp (id, fname, lname, dob)
OUTPUT inserted.id
VALUES (1, 'Test1','Rec1','01/01/1990'), (2, 'Test2','Rec2','01/01/1990')
相反,插入的 2 個命令是連續運行的,而 sqlalchemy 似乎只保留了第二個結果。(我試圖深入研究 sqlalchemy 代碼,但找不到它發生的地方)。
如果您真的想使用 sqlalchemy 的優勢,我建議至少使用 sqlalchemy 查詢語言,并讓 sqlalchemy 構建您的 sql 命令。查找 SQL 運算式語言教程以開始使用。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/352380.html
標籤:Python sql-server sqlalchemy 数据库
