Метод drop_all
Метод drop_all класса MetaData удаляет
все таблицы, которые связаны с данным объектом
метаданных, из базы данных. Первым параметром
метод принимает объект движка или соединения
bind, через который выполняется удаление.
Дополнительно можно передать параметр
checkfirst, который перед удалением проверяет
существование каждой таблицы, и параметр
tables для указания конкретного списка таблиц.
Метод выполняет SQL-команду DROP TABLE для
каждой таблицы в порядке, обратном их созданию,
чтобы корректно учитывать внешние ключи.
Синтаксис
MetaData.drop_all(bind, [tables], [checkfirst])
Пример
Давайте создадим объект MetaData с одной
таблицей articles, создадим ее в базе, а затем
удалим методом drop_all:
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String
engine = create_engine('sqlite:///:memory:')
metadata = MetaData()
articles = Table(
'articles', metadata,
Column('id', Integer, primary_key=True),
Column('title', String),
Column('text', String),
Column('status', String),
Column('num', Integer),
)
metadata.create_all(engine)
print(metadata.tables.keys())
metadata.drop_all(engine)
print(metadata.tables.keys())
Результат выполнения кода:
"dict_keys(['articles'])"
"dict_keys(['articles'])"
Обратите внимание, что метод drop_all удаляет
таблицы из базы данных, но сами объекты таблиц
остаются в коллекции metadata.tables.
Пример
Давайте посмотрим, какой SQL-запрос выполняет
метод drop_all, включив вывод запросов
параметром echo:
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String
engine = create_engine('sqlite:///:memory:', echo=True)
metadata = MetaData()
articles = Table(
'articles', metadata,
Column('id', Integer, primary_key=True),
Column('title', String),
)
metadata.create_all(engine)
metadata.drop_all(engine)
Итоговый SQL запрос:
DROP TABLE articles
Пример
Давайте передадим параметр checkfirst=True,
чтобы метод проверил существование таблиц перед
удалением:
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String
engine = create_engine('sqlite:///:memory:')
metadata = MetaData()
articles = Table(
'articles', metadata,
Column('id', Integer, primary_key=True),
Column('title', String),
Column('text', String),
)
metadata.drop_all(engine, checkfirst=True)
print("drop_all completed")
Результат выполнения кода:
"drop_all completed"
С параметром checkfirst=True метод не выбросит
исключение, даже если таблицы еще не существуют
в базе данных.
Пример
Давайте удалим только определенные таблицы,
передав их список в параметр tables:
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String
engine = create_engine('sqlite:///:memory:')
metadata = MetaData()
articles = Table(
'articles', metadata,
Column('id', Integer, primary_key=True),
Column('title', String),
)
users = Table(
'users', metadata,
Column('id', Integer, primary_key=True),
Column('name', String),
)
metadata.create_all(engine)
print(list(metadata.tables.keys()))
metadata.drop_all(engine, tables=[articles])
print(list(metadata.tables.keys()))
Результат выполнения кода:
['articles', 'users']
['articles', 'users']
В данном примере из базы данных удаляется только
таблица articles, а таблица users остается
нетронутой.
Смотрите также
-
класс
MetaData,
который хранит информацию о таблицах -
метод
create_all,
который создает все таблицы в базе данных -
атрибут
tables,
который хранит словарь всех таблиц метаданных -
метод
clear,
который очищает коллекцию таблиц метаданных