通过循环或函数创建SQLAlchemy参数

时间:2017-10-06 13:47:43

标签: python sqlalchemy

我正在建立一个简短的答案测验(作为字符串输入)。虽然我已经设法启动并运行测验,但我发现我编写的代码似乎有点丑陋/笨拙而且b)在不同情况下不可扩展/可重用。

这是一个例子(这种模式在不同的功能中使用了很多次):

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创建适当的命令 - 这会起作用,但是这似乎是一种冗长的方式。

1 个答案:

答案 0 :(得分: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访问并比较评分。