Подтвердить что ты не робот

Как удалить таблицу в SQLAlchemy?

Я хочу удалить таблицу с помощью SQLAlchemy.

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

До сих пор я использую SQLAlchemy для выполнения raw 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 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() будет работать, но это будет не удобно с момента, когда я начну иметь более одной таблицы, и я хочу сохранить другие.

4b9b3361

Ответ 1

Просто вызовите drop() для объекта таблицы. Из документы:

Выполните инструкцию DROP для этой таблицы, используя данный Connectable для подключения.

В вашем случае это должно быть:

User.__table__.drop()

Если вы получите исключение, например:

sqlalchemy.exc.UnboundExecutionError: Table object 'my_users' is not bound to an Engine or Connection. Execution can not proceed without a database to execute against

Вам нужно передать движок:

User.__table__.drop(engine)

Ответ 2

Ниже приведен пример кода, который вы можете выполнить в iPython для проверки создания и удаления таблицы в Postgres

from sqlalchemy import * # imports all needed modules from sqlalchemy

engine = create_engine('postgresql://python:[email protected]/production') # connection properties stored

metadata = MetaData() # stores the 'production' database metadata

users = Table('users', metadata,
Column('user_id', Integer),
Column('first_name', String(150)),
Column('last_name', String(150)),
Column('email', String(255)),
schema='python') # defines the 'users' table structure in the 'python' schema of our connection to the 'production' db

users.create(engine) # creates the users table

users.drop(engine) # drops the users table

Вы также можете просмотреть мою статью на Wordpress с помощью этого же примера и скриншотов: oscarvalles.wordpress.com(поиск SQL Alchemy).