Считать результаты запроса pyodbc в переменные - PullRequest
0 голосов
/ 06 октября 2019

Контекст: Я пытаюсь запросить данные с SQL Server через Pyodbc и использую циклическую логику для считывания результатов в переменные в блоке запроса ниже.

Вопрос (ы): Может ли кто-нибудь помочь мне изменить приведенный ниже блок кода, чтобы он правильно заполнял переменные с помощью логики зацикливания? Я подозреваю, потому что я использую метод fetchall () в курсоре запроса, чтобы каждая результирующая строка преобразовывалась в кортеж в списке - что затем делает логику циклической обработки под ней бесполезной. Может кто-нибудь предложить альтернативное решение?

from constantcontact import ConstantContact
from constantcontact import Contact
import requests
import json
import pyodbc

username = 'REDACTED'
password = 'REDACTED'

sample_contact_connection = pyodbc.connect("Driver={ODBC Driver 13 for SQL Server};""Server=PC;""Database=leadgen_sandbox;""Username="+username+";""Password="+password+";""Trusted_Connection=yes;")
sample_contact_cursor = sample_contact_connection.cursor()

sample_contact_query = "SELECT first_name,last_name,title,company_name,email_address FROM leadgen_sandbox.dbo.sample_contacts"
sample_contact_connection.autocommit = True
sample_contact_cursor.execute(sample_contact_query)
print(sample_contact_cursor.fetchall())

constantcontact = ConstantContact('REDACTED','REDACTED')
list_id = '1816761971'

for [first_name, last_name, title, company_name, email_address] in sample_contact_cursor.fetchall():
  new_contact = Contact()
  new_contact.set_first_name(''+first_name+'')
  new_contact.set_last_name(''+last_name+'')
  new_contact.set_job_title(''+title+'')
  new_contact.set_company_name(''+company_name+'')
  new_contact.add_list_id(''+list_id+'')
  new_contact.set_email_address(''+email_address+'')
  response = constantcontact.post_contacts(new_contact)
  response_text = json.dumps(response, indent = 4, sort_keys = True)
  print(response_text)
  sample_contact_connection.close()

1 Ответ

0 голосов
/ 06 октября 2019

Когда вы вызывали sample_contact_cursor.fetchall (), вы уже исчерпали содержимое курсора. Таким образом, его содержимое больше не будет доступно для цикла. Удаление печати до того, как петля исправит это . Кроме того, .fetchall () является избыточным в цикле, так как каждая строка будет считываться в цикле for один за другим в любом случае. Вы также можете написать так:

for [first_name, last_name, title, company_name, email_address] in sample_contact_cursor:
  new_contact = Contact()
  new_contact.set_first_name(''+first_name+'')
  new_contact.set_last_name(''+last_name+'')
  #Write your remaining code

Если вам нужно сначала напечатать курсор, а затем запустить цикл, вы должны выполнить курсор один раз перед повторением цикла следующим образом:

sample_contact_cursor.execute(sample_contact_query)
print(sample_contact_cursor.fetchall())

constantcontact = ConstantContact('REDACTED','REDACTED')
list_id = '1816761971'

sample_contact_cursor.execute(sample_contact_query)

for [first_name, last_name, title, company_name, email_address] in sample_contact_cursor:
  new_contact = Contact()
  new_contact.set_first_name(''+first_name+'')
  new_contact.set_last_name(''+last_name+'')
  #Write your remaining code
...