如何初始化表格,以便在包含100个问题的表单上存储不同的答案(SQLite3和Python)

如何初始化表格,以便在包含100个问题的表单上存储不同的答案(SQLite3和Python),python,sqlite,Python,Sqlite,因此,我刚刚开始学习SQLite(以前从未使用过数据库),我有一个表“users”,该表由“user_id”、“email”、“age”、“sex”、“password”组成。我想将“user_id”INT“链接”(join..?)到一个用户特定的(不同的)表,该表将包含用户对100个不同问题的答案。我想存储每个问题的答案。然后计算问题的答案并将其存储在8个不同的变量中。它将显示在条形图中。那我该怎么做呢 正如我现在所想的,我将创建一个新表,该表将在其特定于用户的行中包含所有不同的用户答案。在第

因此,我刚刚开始学习SQLite(以前从未使用过数据库),我有一个表“users”,该表由“user_id”、“email”、“age”、“sex”、“password”组成。我想将“user_id”INT“链接”(join..?)到一个用户特定的(不同的)表,该表将包含用户对100个不同问题的答案。我想存储每个问题的答案。然后计算问题的答案并将其存储在8个不同的变量中。它将显示在条形图中。那我该怎么做呢

正如我现在所想的,我将创建一个新表,该表将在其特定于用户的行中包含所有不同的用户答案。在第1列中包含“user_id”(将“链接”两个不同的表)的行,在第2-101列中存储答案,在第102-110列中存储计算结果。这是“正确的方式”吗

此外,在初始化存储答案的表时,执行以下操作似乎有点乏味:

        CREATE TABLE IF NOT EXISTS answers(
            id INTEGER PRIMARY KEY,
            question_1 INTEGER,
            question_2 INTEGER,
            question_3 INTEGER,
            .
            .
            .
            question_99 INTEGER,
            question_100 INTEGER,
            sums_1 INTEGER,
            sums_2 INTEGER,
            .
            .
            .
            sums_8 INTEGER
        )
我怎样才能做到最好

刚刚试过这个:

    db = sqlite3.connect("tests.db")
    c = db.cursor()
    c.execute('''
        CREATE TABLE IF NOT EXISTS answers(
            id INTEGER PRIMARY KEY, 
    ''')
    for i in range(100):
        c.execute('''
        ALTER TABLE answers
        ADD ''' + 'question_' + i + '''INTEGER''')

    db.commit()

但它没有起作用。为什么?

所以听起来您已经有了两个表,
user
question
,它们存储每个用户的数据,然后存储每个用户询问的问题。现在,您需要存储每个问题和每个用户的答案。这就是我们所说的多对多关系。这意味着每个用户回答许多问题,并且对于每个问题都有许多用户给出了答案。要将其存储在
answer
表中,需要4列:

  • 关系的id。这只是一个典型的主键
  • 用户的外键。这将指定哪个用户给出了答案
  • 一个问题的外键。指定用户回答的问题
  • 问题的答案
  • createtable
    语句留给读者作为练习

    我假设你已经有了一张有问题的桌子。如果没有,则应创建一个至少包含两列的列:

  • 问题的id。这是一个标准的主键
  • 问题本身。我假设这是一个存储问题文本的
    VARCHAR
  • 至于“总和”,你应该根据这个表中存储的数据来计算。如果您的数据库支持这些特性(我不知道SQLite是否支持这两个特性,但其他数据库引擎支持),则可以使用存储过程或视图来实现这一点。如果不支持这些,那么可以在python代码中计算总和。无论哪种方式,您都应该只存储原始答案。显示条形图的任何处理都应该使用SQL或Python以编程方式完成

    这个解决方案提供了很大的灵活性。如果您决定稍后添加问题,您可以通过将问题添加到问题表中来轻松添加问题。然后,用户可以回答这些新问题,并将答案添加到答案表中,而无需对其进行任何更改。您的版本需要向答案表中添加列,这需要更多的工作


    如果你不熟悉主键和外键,你一定要花时间去了解它们。这些是任何关系数据库的基础,因为它们定义了使其成为“关系数据库”的关系。

    因此,听起来您已经有了两个表,
    user
    question
    ,它们存储关于每个用户的数据,然后是每个用户询问的问题。现在,您需要存储每个问题和每个用户的答案。这就是我们所说的多对多关系。这意味着每个用户回答许多问题,并且对于每个问题都有许多用户给出了答案。要将其存储在
    answer
    表中,需要4列:

  • 关系的id。这只是一个典型的主键
  • 用户的外键。这将指定哪个用户给出了答案
  • 一个问题的外键。指定用户回答的问题
  • 问题的答案
  • createtable
    语句留给读者作为练习

    我假设你已经有了一张有问题的桌子。如果没有,则应创建一个至少包含两列的列:

  • 问题的id。这是一个标准的主键
  • 问题本身。我假设这是一个存储问题文本的
    VARCHAR
  • 至于“总和”,你应该根据这个表中存储的数据来计算。如果您的数据库支持这些特性(我不知道SQLite是否支持这两个特性,但其他数据库引擎支持),则可以使用存储过程或视图来实现这一点。如果不支持这些,那么可以在python代码中计算总和。无论哪种方式,您都应该只存储原始答案。显示条形图的任何处理都应该使用SQL或Python以编程方式完成

    这个解决方案提供了很大的灵活性。如果您决定稍后添加问题,您可以通过将问题添加到问题表中来轻松添加问题。然后,用户可以回答这些新问题,并将答案添加到答案表中,而无需对其进行任何更改。您的版本需要向答案表中添加列,这需要更多的工作


    如果你不熟悉主键和外键,你一定要花时间去了解它们。这些是任何关系数据库的基础,因为它们定义了使其成为“关系数据库”的关系。

    在列名中使用数字始终是可以做不同事情的标志。我想你需要退一步想想你在这里储存了什么?答案是什么?您真的需要存储个人答案吗?还是创建一个问题表来存储问题有意义?您是否已经有了一个包含问题的表?在列名中使用数字始终是您可以做一些事情的标志