2016-03-10 5 views
12

Я хочу удалить таблицу с помощью 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() будет работать, но это не будет удобно с того момента, я начинаю иметь больше, чем одну таблицу, и я хочу, чтобы сохранить другие.

ответ

19

Просто позвоните drop() против объекта таблицы. От the docs:

Issue a DROP statement for this Table, using the given Connectable for connectivity.

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

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

Интересно! Однако, если я добавлю 'User .__ table __. Drop()', я получаю сообщение об ошибке: 'sqlalchemy.exc.UnboundExecutionError: объект таблицы 'my_users' не привязан к движку или соединению. Выполнение не может продолжаться без выполнения базы данных против. Это выглядит разумно, но я не знаю, как использовать движок или сеанс для этого. – fedorqui

+3

@fedorqui Попробуйте передать двигатель в качестве аргумента drop(), и дайте мне знать – daveoncode

+5

О человеке 'User .__ table __. Drop (engine)' сделал это, огромное спасибо! – fedorqui

1

Ниже приведен пример кода можно выполнить в 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's 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 Алхимия).

 Смежные вопросы

  • Нет связанных вопросов^_^