Я хочу удалить таблицу с помощью SQLAlchemy.Как удалить таблицу в SQLAlchemy?
Поскольку я тестирую снова и снова, я хочу удалить таблицу my_users
, чтобы я мог начать с нуля каждый раз.
До сих пор я использую SQLAlchemy для выполнения необработанного SQL с помощью метода engine.execute():
sql = text('DROP TABLE IF EXISTS my_users;')
result = engine.execute(sql)
Однако, мне интересно, если есть стандартный способ сделать это. Только один я смог найти drop_all()
, но он удаляет всю структуру, а не только один конкретный стол:
Base.metadata.drop_all(engine) # all tables are deleted
Например, если это очень простой пример. Он состоит из инфраструктуры SQLite с одной таблицей my_users
, в которой я добавляю некоторый контент.
from sqlalchemy import create_engine, Column, Integer, String, text
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
engine = create_engine('sqlite://', echo=False)
Base = declarative_base()
class User(Base):
__tablename__ = "my_users"
id = Column(Integer, primary_key=True)
name = Column(String)
def __init__(self, name):
self.name = name
# Create all the tables in the database which are
# defined by Base's subclasses such as User
Base.metadata.create_all(engine)
# Construct a sessionmaker factory object
session = sessionmaker()
# Bind the sessionmaker to engine
session.configure(bind=engine)
# Generate a session to work with
s = session()
# Add some content
s.add(User('myname'))
s.commit()
# Fetch the data
print(s.query(User).filter(User.name == 'myname').one().name)
Для этого конкретного случая, drop_all()
будет работать, но это не будет удобно с того момента, я начинаю иметь больше, чем одну таблицу, и я хочу, чтобы сохранить другие.
Интересно! Однако, если я добавлю 'User .__ table __. Drop()', я получаю сообщение об ошибке: 'sqlalchemy.exc.UnboundExecutionError: объект таблицы 'my_users' не привязан к движку или соединению. Выполнение не может продолжаться без выполнения базы данных против. Это выглядит разумно, но я не знаю, как использовать движок или сеанс для этого. – fedorqui
@fedorqui Попробуйте передать двигатель в качестве аргумента drop(), и дайте мне знать – daveoncode
О человеке 'User .__ table __. Drop (engine)' сделал это, огромное спасибо! – fedorqui