2017-10-06 6 views
0

Je crée un quiz à réponse courte (entrée sous forme de chaîne). Alors que j'ai réussi à faire fonctionner le quiz, je constate que j'écris du code qui semble a) un peu moche/lourd et b) n'est pas extensible/réutilisable dans différentes situations.Création d'un paramètre SQLAlchemy par une boucle ou une fonction

Voici un exemple (ce modèle est utilisé plusieurs fois dans différentes fonctions):

answers_to_store = Answer(answer_1=user_answer_list[0], 
           answer_2=user_answer_list[1], 
           answer_3=user_answer_list[2], 
           answer_4=user_answer_list[3], 
           answer_5=user_answer_list[4]) 

Y at-il une meilleure façon de créer ces paramètres? Je ne vois pas comment remplacer le nom du paramètre (c'est-à-dire answer_1) par une variable ou similaire (ce qui est la seule façon de rendre la tâche plus facile). La seule façon que j'ai trouvé serait de créer les paramètres en tant que texte en utilisant une boucle, puis en exécutant la commande résultante via exec - est-ce la seule façon d'y parvenir, ou y a-t-il un meilleur moyen? L'autre limite est que cela signifie qu'ayant une fonction de stockage pour stocker 5 réponses à partir d'un quiz serait différent d'un stockage de 20 réponses (la base de données a ce nombre de colonnes). J'ai essayé de chercher, mais le problème est que je ne connais pas le bon terme pour cela, et la chose la plus proche est la création de la commande appropriée via une boucle et exec - ce qui fonctionnerait, mais semble une façon longue de le faire.

Répondre

0

En supposant qu'il s'agit d'un questionnaire à réponse courte, créez une base de données de questionID, answer_string puis accédez à la table avec le questionID et comparez la sortie avec l'entrée de l'utilisateur. Voici l'idée:

from sqlalchemy import create_engine, Table, MetaData, Column, Integer, VARCHAR 
from sqlalchemy.orm import mapper, sessionmaker 

Session = sessionmaker() 

engine = create_engine('sqlite:///foo.db') 
Session.configure(bind=engine) 

sess = Session() 

metadata = MetaData() 

question = Table('question', metadata, 
      Column('id', Integer, primary_key=True), 
      Column('answerKey', VARCHAR(None)) 
      ) 

class Question(object): 
    def __init__(self, answer): 
     self.answer = answer 


mapper(Question, question) 


def check(INquestionID, answerInput): 
    # Return an answer string associated with the question. 
    ans = sess.query(question.answer).filter(question.id == INquestionID).limit(1) 

    if answerInput == ans[0]: 
     return True 
    else: 
     return False 

Cette méthode stocke une chaîne (jusqu'à 8000 caractères dans SQL Server), les accès en fonction de l'ID et compare pour le classement.

+0

Salut. Merci pour cela, malheureusement ce n'est pas un questionnaire à choix multiples, chaque question a une chaîne comme réponse, donc je ne peux toujours pas voir comment accéder/créer les paramètres d'une manière ordonnée. – djaychela

+0

@djaychela chaîne de saisie est une partie assez importante du quiz. J'ai suggéré une modification. – brddawg

+0

En outre, vous devez remarquer que j'ai modifié la réponse pour accepter la chaîne de réponse. – brddawg