PostgreSQL in Python3 - SyntaxError в операторе создания таблицы с внешним ключом - PullRequest
0 голосов
/ 02 апреля 2020

Я пытаюсь создать таблицу (basic_totals), которая содержит внешний ключ к первичному ключу другой таблицы (игроков). Я сохраняю оператор в строке следующим образом:

player_table_name = "players"
basic_table_name = "basic_totals"
basic_table_statement = '''
    CREATE TABLE IF NOT EXISTS public.{0} (
        id SERIAL PRIMARY KEY,
        player_id SERIAL REFERENCES {1}(id),
        GP SMALLINT,
        3PTA SMALLINT,
        3PTM SMALLINT,
        FGA SMALLINT,
        FGM SMALLINT,
        FTA SMALLINT,
        FTM SMALLINT,
        PTS SMALLINT,
        FTM SMALLINT,
        PTS SMALLINT,
        REB SMALLINT,
        AST SMALLINT,
        STL SMALLINT,
        BLK SMALLINT,
        TO SMALLINT
    );'''.format(basic_table_name, player_table_name)

При попытке выполнить этот оператор с помощью курсора соединения (cursor.execute (basic_table_statement)) возникает ошибка SyntaxError. Поскольку оператор создания для другой таблицы (игроков) выполняется аналогичным образом (за исключением части внешнего ключа), я предполагаю, что ошибка связана с этой частью.

Что не так с моим синтаксисом и как можно ли отладить его дальше?

1 Ответ

0 голосов
/ 02 апреля 2020

TO является зарезервированным ключевым словом . Если вы действительно настаиваете на его использовании, вам нужно использовать двойные кавычки , чтобы избежать его, например, "to".

Но как только вы это сделаете, имя становится регистром чувствительным , поэтому TO и "TO" - это разные имена (потому что TO свернут в нижний регистр).

Однако использование указанных в кавычках идентификаторов настоятельно не рекомендуется , и я крайне рекомендую вам найти другое имя столбца, которое не нужно заключать в кавычки.

Другая проблема - имена столбцов 3PTA и 3PTM. Идентификаторы не могут начинаться с цифры, поэтому вам также нужно найти для них другое имя (если только вы не хотите использовать эти страшные двойные кавычки).

Повторение столбца первичного ключа целевой таблицы не необходимо для встроенного предложения ССЫЛКИ. Вы также дважды определили столбцы FTM и PTS.

Не причиной ошибки, а другим неправильным выбором является тип serial для player_id. serial не тип данных. Это сокращение для столбца integer, который получает значение по умолчанию из последовательности. Столбцы внешнего ключа никогда не следует определять как последовательные, поскольку они ссылаются на уже сгенерированное значение. Таким образом, это должно быть player_id integer REFERENCES {1}(id),

Если сложить все это вместе, SQL должно выглядеть так:

CREATE TABLE IF NOT EXISTS some_table (
    id serial primary key,
    player_id integer references other_table,
    gp smallint,
    pta3 smallint, --<< here
    ptm3 smallint, --<< here
    fga smallint,
    fgm smallint,
    fta smallint, 
    ftm smallint,  --<< only once!
    pts smallint,  --<< only once!
    reb smallint,
    ast smallint,
    stl smallint,
    blk smallint,
    to_x smallint  --<< change here
);

...