2016-06-22 6 views
2

Здравствуйте, я работаю над скриптом на Python, который будет подключаться к db, чтобы получить некоторую информацию и отправить электронные письма. У меня проблема с запросами, сделанными с Psycopg.Python Psycopg2 cursor.execute return None

Я хотел бы получить всех пользователей, где created_at = nb_days. Мой запрос работает очень хорошо в Navicat/pgadmin и I'have 53 записей с запросом:

select a.account_name, a.email, a.user_id, a.locale, a.firstname from v_accounts a where date(a.created_at) = date(current_date - interval '2 days') 

Но когда я исполню мой сценарий у меня есть None как результат запроса. Это мой сценарий class:

import psycopg2 

class MyDatabase(object): 
    db_name='you' 
    user='will' 
    pw='never' 
    host='know' 
    port='it' 

    def __init__(self, db=db_name, user=user, password=pw, host=host, port=port): 
     """Connection to db - creation of the cursor""" 
     try: 
      self.baseDonn = psycopg2.connect(host=host, port=port, database=db, user=user,password=password) 
     except Exception as err: 
      print('La connexion avec la base de données à échoué : Erreur détéctée : %s' % err) 
     else: 
      self.cursor=self.baseDonn.cursor() # Création du curseur 

    def get_data_from_accounts(self,nb_days): 
     ''' Method that retrieves data from all accounts that were created nb_days before today ''' 
     sql="select a.account_name,u.email, u.user_id,u.locale, u.firstname from accounts a inner join account_users au on a.account_id=au.account_id inner join users u on au.user_id=u.user_id where date(a.created_at) = date(current_date - interval '%s days');" 
     print(sql) 
     data=(nb_days,) 
     try: 
      records = self.cursor.execute(sql,data) 
      print('cursor-execute={}'.format(records)) 
     except Exception as err: 
      print("La requete n'est pas passée, erreur={}".format(err)) 
     else: 
      return records 

Это основная часть

from my_db import MyDatabase 
database=MyDatabase() 

# On va récupérer les données des nouveaux accounts d'y a un jours 
days_ago_2=database.get_data_from_accounts(2) 

for personne_1 in days_ago_2: 
    # data 
    #account_name=personne_1[0] 
    email=personne_1[1] 
    user_id=personne_1[2] 
    locale=personne_1[3] 
    firstname='' if personne_1[4] is None else personne_1[4] 

    language = locale.split('_')[1] 
    activation_token= database.get_activation_token(user_id) 

    subject = call_to_template2(firstname, language,activation_token)['subject'] 
    content = call_to_template2(firstname, language,activation_token)['content'] 

    print('EMAIL={} - ID={} - LANGUE={} - FIRSTNAME={}'.format(email, user_id, language, firstname)) 
    #send_data(qui_envoie, email, subject, content, token, language) 

И моя ошибка на линии for personne_1 in days_ago_2: потому что None object is not iterable. И я видел, что результат моего запроса get_data_from_accounts(2) = None

+1

Ваше строковое построение строки кажется мне странным. Что означает «print (sql)» в качестве вывода? Кроме того, вы должны указать более точный заголовок, если хотите получить ответы от людей, которые имели такую ​​же проблему. Ваше название слишком велико. – Carele

ответ

7

cursor.execute allways возвращает None. Вам необходимо установить fetch набор записей:

try: 
    self.cursor.execute(sql,data) 
    records = self.cursor.fetchall() 
+0

Спасибо! Извините за этот вопрос noobs, я полностью забыл об этом «fetch» ​​(( –

Смежные вопросы