Python и SQL — Python фактически не будут передавать данные в SQL DB

#sql-server #python-3.x

#sql-server #python-3.x

Вопрос:

Это вопрос из 2 частей, но я перейду к моей первой головоломке.

У меня есть некоторый код, я просто пытаюсь проверить, где я хочу, чтобы Python запускал хранимую процедуру с требуемыми переменными, и она запускается и даже показывает новую строку. Однако, если я войду в БД и выполню оператор SELECT, чтобы показать мне данные, их там нет. Как будто БД заблокировала его или что-то странное.

Этот код РАБОТАЕТ, если я запускаю оператор select вместо этой хранимой процедуры. Хранимая процедура работает, и даже когда я запускаю этот код, Python запустит хранимую процедуру и вернет новую строку (в комплекте с новым номером строки, который автоматически генерируется из-за идентификатора, который у меня есть в столбце)

 import pyodbc
conn = pyodbc.connect('Driver={SQL Server};'
                      'Server=REPORTINSTANCE;'
                      'UID=UserID;'
                      'PWD=Password;'
                      'Database=ReportDB;'
                      'Trusted_Connection=no;')

cursor = conn.cursor()
cursor.execute('EXEC [Schema].[Comments] '2019-04-18 00:00:00.000','Team','1900-01-01 13:12:16.000','testing this string','username'')


for row in cursor:
    print(row)
 

Здесь что-то потеряно. Python запустит хранимую процедуру (которую я установил для запуска select в конце, чтобы доказать, что данные были зафиксированы), и Python показывает это, но я не вижу этого в реальной БД. Эта строка исчезла.

Это результат после запуска хранимой процедуры в Python

Вы можете видеть здесь, 470 — это столбец ID (Identity, без null), и это то, что должно быть.

Вот SQL run сразу после

Обратите внимание, что самая последняя запись по-прежнему 469

  • Тот же экземпляр
  • Та же БД

Редактировать

Я только что заметил кое-что в Python. Каждый раз, когда я запускаю код Python, он запускает код, и хранимая процедура выполняет выбор в конце, но каждый раз, когда я ее запускаю, значение CommentsID увеличивается на 1 (как и должно быть), но оно НЕ запоминает предыдущие, вставленные Python. Единственные, которые возвращает оператор SELECT, — это тот, который я передал через сам SQL.

введите описание изображения здесь

Обратите внимание, что идентификатор комментария (первое число в каждой строке, начинающееся с 4) изменяется с 469 на 471. Тем не менее, у меня только что было это изображение выше, которое показывает 470 — куда делся 470 ?!

Вторая часть:

Мне сложно вводить переменные в этот раздел EXEC кода. Я думаю, мне нужно заключить его в одинарные кавычки, что означает, что мне нужно поставить перед кавычками, которые мне нужны, чтобы остаться для кода SQL. Но когда я делаю это, а затем пытаюсь запустить его, я не могу заставить его вводить переменные.

Вот каким должен быть SQL:

 EXEC [schema].[Comments] 'Username'
 

В Python я знаю, что мне нужно, чтобы они были в одинарных кавычках, но поскольку в коде SQL есть кавычки, вы обычно просто ставите перед следующим образом:

 'EXEC [schema].[Comments] 'Username''
 

Это работает. Однако затем я хочу, чтобы username извлекалось из переменной, а не из строки.

Комментарии:

1. … вы уверены, что смотрите на ту же базу данных / сервер?

2. Я не знаком с Python, но вам нужно что-то вроде cnxn.commit()?

3. Если вы видите это в SELECT в конце , данные есть; если это не так, SELECT не смог их отобразить. Вторая часть — это отдельный вопрос. В обоих случаях (SPROC, для которого вы не включили код, и код, в который вы пытаетесь включить переменные), мы не можем помочь вам отладить код, который мы не видим в вашем вопросе.

4. @RobertPaulsen — да, SQL на самом деле является моей специальностью. Я вернулся, чтобы проверить свою работу, но это определенно все тот же сервер / база данных.

5. @KenWhite Верно? Вот почему у меня есть этот выбор. Это довольно непонятно. Хотел бы я показать вам, что я вижу.