2017-10-06 100 views
0

我正在構建一個簡答題測驗(以字符串形式輸入)。雖然我已經設法讓測驗正常運行,但我發現我正在編寫的代碼看起來有點醜陋/笨拙,並且b)在不同情況下不可擴展/可重用。循環或函數創建SQLAlchemy參數

下面是一個例子(這種模式適用於不同功能的次數):

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]) 

是否有更好的方法來創建這些參數?我看不到用變量或類似方法替換參數名稱(即answer_1)的方法(這是我可以考慮簡化任務的唯一方法)。

我發現的唯一方法是使用循環創建參數爲文本,然後通過exec運行生成的命令 - 是實現此目的的唯一方法,還是有更好的方法?另一個限制是,這意味着具有存儲函數來存儲來自測驗的5個答案將不同於存儲20個答案(數據庫具有許多列)的答案。

我試過尋找,但問題是我不知道這個正確的術語,最近我想出的是通過循環和exec創建適當的命令 - 哪些工作,但似乎是這樣做的一種囉嗦方式。

回答

0

假設這是一個簡短的答案測驗,創建一個questionID數據庫,answer_string然後訪問帶有questionID的表並將輸出與用戶輸入進行比較。這裏的理念是:

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 

這種方法存儲一個字符串(最多在SQL Server 8000個字符)的基礎上的ID,訪問並比較了分級。

+0

嗨。謝謝你,不幸的是,這不是一個多項選擇測驗,每個問題都有一個字符串作爲答案,所以我仍然無法看到如何以一種整潔的方式訪問/創建參數。 – djaychela

+0

@djaychela字符串輸入是測驗非常重要的一部分。我建議編輯。 – brddawg

+0

另外,你應該注意到我編輯了答案以適應答案字符串。 – brddawg