#sqlite #database-schema #flask
#sqlite #база данных-схема #flask
Вопрос:
Я новичок в Flask и хочу создать приложение для опроса, используя flask и sqlite3 в качестве ядра базы данных.
Мой вопрос в том, как я могу создать две таблицы «вопросы» и «варианты», чтобы у каждого вопроса было несколько вариантов (возможно, не фиксированное число.
Мой первоначальный подход был довольно наивным:
drop table if exists entries;
create table question (
ques_id integer primary key autoincrement,
ques string not null,
choice1 string not null,
choice2 string not null,
choice3 string not null,
choice4 string not null,
pub_date integer
);
Ответ №1:
Ниже приведен более нормализованный подход. Это удобно для хранения отдельного набора вариантов, общих для всех вопросов.
CREATE TABLE choices (
choice_id integer primary key autoincrement,
choice string not null
);
CREATE TABLE questions (
ques_id integer primary key autoincrement,
ques string not null,
choice_id integer,
FOREIGN KEY(choice_id) REFERENCES choice(choice_id)
);
Пример сеанса интерпретатора:
>>> import sqlite3
>>> conn = sqlite3.connect(':memory:')
>>> c = conn.cursor()
>>> c.execute("""CREATE TABLE choices (
... choice_id integer primary key autoincrement,
... choice string not null
... );""")
<sqlite3.Cursor object at 0x7f29f60b8ce8>
>>> c.execute("""CREATE TABLE questions (
... ques_id integer primary key autoincrement,
... ques string not null,
... choice_id integer,
... pub_date integer,
... FOREIGN KEY(choice_id) REFERENCES choice(choice_id)
... );""")
<sqlite3.Cursor object at 0x7f29f60b8ce8>
>>> c.execute("INSERT INTO choices (choice) VALUES ('yes')")
<sqlite3.Cursor object at 0x7f29f60b8ce8>
>>> c.execute("""INSERT INTO questions (ques,choice_id)
VALUES ('do you like sqlite?',1)""")
<sqlite3.Cursor object at 0x7f29f60b8ce8>
>>> c.execute("""SELECT ques, choice
FROM questions q
JOIN choices c ON c.choice_id = q.choice_id;""")
>>> c.fetchall()
[(u'do you like sqlite?', u'yes')]
Комментарии:
1. @Adam- просто чтобы прояснить мое замешательство… что происходит в последней строке схемы?
2. @infoquad: я не могу сделать лучше, чем собственная превосходная документация SQLite по этому вопросу: sqlite.org/foreignkeys.html Приветствия.