ALTER TABLE Sqlite: как проверить, существует ли столбец, прежде чем изменять таблицу?

Мне нужно выполнить в python SQL-запрос, который добавляет новый столбец в sqlite3.

Проблема в том, что иногда он уже существует. Итак, перед выполнением запроса мне нужно проверить, существует ли уже столбец.

Если да, то я не буду выполнять запрос.

Есть ли способ сделать это в sqlite? Или мне нужно пройти через блок try-catch в коде Python?

Заранее большое спасибо!


person Esabe    schedule 01.03.2010    source источник


Ответы (3)


Вы можете получить список столбцов для таблицы с помощью следующего оператора:

PRAGMA table_info('table_name');

Более подробная информация о командах pragma доступна на веб-сайте sqlite.

person My Other Me    schedule 01.03.2010
comment
Вопрос помечен как "python", но он не показывает вам, как это сделать в Python. - person user5359531; 01.03.2018

ИМО это

conn = sqlite3.connect(':memory:')
c = conn.cursor()
try:
    c.execute('ALTER TABLE mytable ADD COLUMN newcolumn;')
except:
    pass # handle the error
c.close()

- лучший выбор, чем создание запросов специального случая.

Вы можете обернуть приведенный выше код в функцию AddColumn (курсор, таблица, столбец), чтобы вы могли повторно использовать его,
плюс это сделает код более читабельным.

person Nick Dandoulakis    schedule 01.03.2010

По какой-либо причине вам нужен явный способ проверки наличия столбца, вы можете найти полный рецепт Python ниже. Вы можете заключить код в функцию или улучшить ее

import sqlite3

sqlite_db = 'my_sqlite_db.sqlite'
col_to_test = 'my_column'
table_to_test = 'my_table_name'

con = sqlite3.connect(sqlite_db)
check_sqlite_col_exist_query = """SELECT count(*) > 0
FROM pragma_table_info('{}')
WHERE name=?;""".format

with con:
    q = con.execute(check_sqlite_col_exist_query(table_to_test), (col_to_test, ))
    col_exist = q.fetchone()
    col_exist = col_exist[0] > 0
    if not col_exist:
        print('"{}" column does not exist in table "{}"!'.format(col_to_test, table_to_test))
        # Do stuff here like adding your column or something else
    else:
        print('"{}" column already exist in table "{}"!'.format(col_to_test, table_to_test))
person Thomas Gratier    schedule 25.11.2020