Невозможно отправить LabNumber в sql-запрос
Я очень озадачен тем, почему моя переменная _labNumber не отправляется в метод, который я использую для вызова SQL-запроса, так как она работает для других методов в том же классе. У меня есть блок try catch в классе, который вызывает методы, где я передаю _labNumber (она правильно назначена, я трижды проверил ее)
try:
_comment = self.dataServices.GetComment(_labNumber)
_value2 = self.dataServices.GetValue2(_labNumber)
_value1 = self.dataServices.GetValue1(_labNumber)
_results = self.dataServices.getResults(_labNumber)
except AttributeError:
_comment = None
_value2 = None
_value1 = None
_results = None
Это один из методов класса, который используется для получения данных из базы данных:
def GetValue2(self, _LabNumber):
_LabNumberStr = str(_LabNumber)
try:
with connection.cursor() as _cursor:
_cursor.execute("{CALL dbo.uspShireXGetValue2(%s)}", _LabNumberStr)
row = _cursor.fetchone()
if row:
return {'VALUE2': row[0]}#21
else:
return {'VALUE2': None}
except Exception as e:
# Handle or log the exception as appropriate
print(f"An error occurred: {e}")
return {'VALUE2': None}
И, наконец, вот запрос, который, как я знаю, работает, поскольку он возвращает данные, когда я жестко задаю номер лаборатории:
@LabNumber VARCHAR(10)
AS
SET NOCOUNT ON
SELECT
WDR.COMMENT
FROM dbo.DNA_WORKSHEET_DET WD
INNER JOIN dbo.DNA_WORKSHEET W ON WD.WORKSHEET = W.WORKSHEET
LEFT OUTER JOIN dbo.DNA_TEST T ON W.TEST = T.TEST
LEFT OUTER JOIN dbo.DNA_LAB_TEST LT ON WD.LABNO = LT.LABNO AND W.TEST = LT.TEST
LEFT OUTER JOIN dbo.DNA_WORKSHEET_DET_RESULT WDR ON WD.WORKSHEET = WDR.WORKSHEET AND WD.LANE = WDR.LANE
WHERE WD.LABNO = @LabNumber
return
Выдается ошибка 'An error occurred: not enough arguments for format string ' Любая помощь в исправлении этой ошибки будет очень признательна, так как я бьюсь головой об стену уже несколько дней.
Вам нужно обернуть параметр(ы) в список, поэтому:
def GetValue2(self, _LabNumber):
_LabNumberStr = str(_LabNumber)
try:
with connection.cursor() as _cursor:
_cursor.execute('{CALL dbo.uspShireXGetValue2(%s)}', [_LabNumberStr])
row = _cursor.fetchone()
if row:
return {'VALUE2': row[0]} # 21
else:
return {'VALUE2': None}
except Exception as e:
# Handle or log the exception as appropriate
print(f"An error occurred: {e}")
return {'VALUE2': None}
При этом, пожалуйста, не делайте необработанных запросов. Работая с QuerySet
, вы можете дополнительно манипулировать тем же запросом: например, пагинация, фильтрация, аннотирование. Необработанный запрос этого не позволяет.