#python #pyodbc
#python #pyodbc
Вопрос:
У меня есть таблица sql, которую я хочу обновить на основе функции, пока это мой код:
def read(conn):
cursor = conn.cursor()
#cursor2 = conn.cursor()
cursor.execute("SELECT All [id],[keyword],[result],[status],[createddate] FROM [Table1].[dbo].[aa]")
index = 1
cursor.execute("set nocount on")
for row in cursor:
s = row[1]
s = re.sub(r'[^ws]', '', s)
a=do_func(s)
if a:
cursor.execute("update [Table1].[dbo].[aa] set status = 'completed', result = 'True' where id ={}".format(index))
else:
cursor.execute("update [Table1].[dbo].[aa] set status = 'completed', result = 'False' where id ={}".format(index))
if index == 10:
break
index = 1
я получаю pyodbc.ProgrammingError: No results. Previous SQL was not a query.
Я добавил «установить nocount вкл.», но не решил я также попытался создать второй курсор, но также не решил проблему
Комментарии:
1. что делает do_func?
2. @MEdwin просто возвращает значение True или False
3. Вы должны зафиксировать изменения с помощью
conn.commit()
.4. Зачем вам нужно добавлять
.format(index)
строку запроса SQL?5. @vcp я не уверен, что я просто скопировал код с youtube, если у вас есть идея получше, пожалуйста, покажите какой-нибудь код
Ответ №1:
хорошо, смотрите код: вам нужно будет разделить курсор для выбора и курсор для обновления, вы не можете использовать оба одновременно. И после обновления вам нужно будет зафиксировать. Дайте мне знать, если это сработает.
def read(conn):
selectcursor = conn.cursor()
updatecursor = conn.cursor()
selectcursor.execute("SELECT [id],[keyword],[result],[status],[createddate] FROM [Table1].[dbo].[aa]")
index = 1
result = selectcursor.fetchall()
for row in result:
s = row[1]
s = re.sub(r'[^ws]', '', s)
a=do_func(s)
if a:
updatecursor.execute("update [Table1].[dbo].[aa] set status = 'completed', result = 'True' where id ={}".format(index))
updatecursor.commit()
else:
updatecursor.execute("update [Table1].[dbo].[aa] set status = 'completed', result = 'False' where id ={}".format(index))
updatecursor.commit()
if index == 10:
break
index = 1
selectcursor.close()
updatecursor.close()
Комментарии:
1.
updatecursor.execute("update [Table1].[dbo].[a] set status = 'completed', resulturl = 'False' where id ={}".format(index)) pyodbc.Error: ('HY000', '[HY000] [Microsoft][ODBC SQL Server Driver]Connection is busy with results for another hstmt (0) (SQLExecDirectW)')
2. кажется, в этой таблице есть блокировка
3. что вы подразумеваете под блокировкой?
4. таблицы базы данных блокируются, когда вы пытаетесь ее обновить, так что только один человек может завершить обновление. итак, после обновления соединение должно быть закрыто. Я изменил скрипт, взгляните.
5. решение состоит в том, чтобы добавить cursor.close()