Мне любопытно, почему мои данные были переданы на сервер, так как я понимаю, что при записи строк в SQL Server через pyodbc
вы должны сначала вызвать 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, а не наоборот, как это показано выше.