Как почистить базу, удалив все записи с помощью sqlalchemy?

Я использую SQlAlchemy. Я хочу удалить все записи, эффективно присутствующие в базе данных, но я не хочу удалять таблицу/базу данных.

Я пробовал со следующим кодом.

con = engine.connect()
trans = con.begin()

con.execute(table.delete())
trans.commit()

Кажется, это не очень эффективно, так как я перебираю всю таблицу, присутствующую в базе данных. Может ли кто-нибудь предложить мне лучший и эффективный способ сделать это?

Любая помощь очень ценится здесь.


person Rakesh    schedule 27.06.2012    source источник
comment
Для некоторых баз данных существует оператор truncate. Он воссоздает таблицу и работает быстрее, а не транзакционный. Вы можете выполнить его с помощью необработанного SQL с помощью engine.execute('''truncate tablename''')   -  person varela    schedule 27.06.2012
comment
@Varela Спасибо, что поделились своими мыслями. Я хочу написать метод/функцию таким образом, чтобы он работал со всеми базами данных. Поскольку truncate зависит от БД, это не мой первый выбор.   -  person Rakesh    schedule 27.06.2012
comment
Тогда нет ничего лучше, вы не можете отказаться от перебора таблиц и удалить, пожалуй, единственный оператор, который работает для всех БД.   -  person varela    schedule 27.06.2012
comment
Что не так с metadata.drop_all(), а затем с metadata.create_all()   -  person jadkik94    schedule 27.06.2012
comment
См.: stackoverflow.com/questions/4763472/   -  person kolypto    schedule 09.08.2014


Ответы (2)


Если ваши модели полагаются на существующую схему БД (обычно используется autoload=True), вы не можете избежать удаления данных в каждой таблице. MetaData.sorted_tables пригодится:

for tbl in reversed(meta.sorted_tables):
    engine.execute(tbl.delete())

Если ваши модели определяют полную схему, нет ничего проще, чем drop_all/create_all< /a> (как уже указал @jadkik94).

Кроме того, TRUNCATE в любом случае не будет работать с таблицами, на которые ссылается ForeignKeys, что значительно ограничивает использование.

person van    schedule 27.06.2012
comment
Привет. мой meta.tables или meta.sorted_tables по какой-то причине является пустым списком. У меня 3_. Почему он отображается пустым, когда в базе данных есть таблицы? - person Alex Okrushko; 02.08.2012
comment
Если у вас нет определенных моделей, привязанных к этому meta, ничего не будет. Но если вы не хотите определять модели и хотите получить их reflect из базы данных, вам нужно вызвать MetaData.reflect сначала - person van; 02.08.2012
comment
Вау, спасибо за вашу помощь! Еще один вопрос, если не возражаете. Теперь, чтобы получить экземпляр таблицы, я могу сделать meta.tables['tasks'], но это означает, что я должен помнить имя класса (Tasks) и имя таблицы "tasks". Есть ли способ избежать этого? - person Alex Okrushko; 02.08.2012
comment
Я не уверен, что вы подходите к этому с правильного угла. Но, пожалуйста, взгляните на Использование отражения с декларативным и декларативным отражением . Это должно дать вам представление о том, как определить только классы моделей без таблиц. - person van; 02.08.2012
comment
Спасибо за указание в правильном направлении. Мне нужно было session.query(Tasks).delete() - person Alex Okrushko; 04.08.2012

Для меня установка tbl.drop(engine) сработала, но не engine.execute(tbl.delete())

SQLAlchemy 0.8.0b2 и Python 2.7.3

person chiffa    schedule 25.02.2013