【发布时间】:2019-09-19 15:01:30
【问题描述】:
我很好奇为什么我的数据会被提交到服务器,因为据我了解,当通过pyodbc 将行写入 SQL Server 时,您必须先调用 connection.commit(),然后才能将数据提交到服务器。但是,当我在不使用 commit() 的情况下运行以下代码时,数据仍被提交到我的表中,经验证:
cursor.execute("SELECT * FROM db.table")
tables = cursor.fetchall()
以及通过 SSMS 手动检查表格。
这是我用来更新表并认为它不会提交数据但确实提交的代码示例。
import pyodbc
row_string = 'FIRST_NAME, LAST_NAME, MEMBER_EMAIL, SUPERVISOR_NAME, SUPERVISOR_EMAIL, MEMBER_TITLE'
value_string = [['Name', 'LName', 'Name.LName@randome.com', 'Super Name',
'Super.Name@random.com', 'Some Title']]
ex_value = "insert into DB.TABLE ({}) values (?, ?, ?, ?, ?, ?)".format(row_string)
print(ex_value)
odbc_driver, server, db = '{ODBC Driver 17 for SQL Server}', 'server_address', 'dbname'
# I did try to use this try/except statement provided by Chiheb Nexus below.
# Oddly enough this committed the data but my print statement did not execute.
with pyodbc.connect(driver=odbc_driver, host=server, database=db, trusted_connection='yes') as conn:
try:
conn.autocommit = False
cursor = conn.cursor()
cursor.executemany(ex_value, value_string)
cursor.execute("SELECT * FROM db.TABLE")
tables = cursor.fetchall()
for row in tables:
print('Row: {}'.format(row))
except pyodbc.DatabaseError as err:
conn.rollback()
else:
conn.commit()
finally:
conn.autocommit = True
cursor.close()
数据结果:
insert into db.TABLE (FIRST_NAME, LAST_NAME, MEMBER_EMAIL, SUPERVISOR_NAME, SUPERVISOR_EMAIL, MEMBER_TITLE) values (?, ?, ?, ?, ?, ?)
Row: (9002, 'Name', 'LName', 'Name.LName@randome.com', 'Super Name', 'Super.Name@random.com', 'Some Title', 'None')
Row: (9001, 'Name1 ', 'LName1', 'Name1.LName1@random.com', 'Super Name', 'Super.Name@random.com', 'Some Title', 'None')
如果有人知道(不是奇怪的问题)为什么我的数据以相反的顺序表示,那么附带问题。我希望我的数据按照记录 9001 而不是 9002 从上到下排序,而不是像上面显示的相反。
【问题讨论】:
标签: python sql-server odbc pyodbc