#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 показывает это, но я не вижу этого в реальной БД. Эта строка исчезла.
Вы можете видеть здесь, 470 — это столбец ID (Identity, без null), и это то, что должно быть.
Обратите внимание, что самая последняя запись по-прежнему 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 Верно? Вот почему у меня есть этот выбор. Это довольно непонятно. Хотел бы я показать вам, что я вижу.