Как удалить таблицу в SQLAlchemy?
Я хочу удалить таблицу с помощью SQLAlchemy.
поскольку я тестирую снова и снова, я хочу удалить таблицу my_users
Так что я могу начать с нуля каждый раз.
до сих пор я использую SQLAlchemy для выполнения raw SQL через двигатель.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()
будет работать, но это не будет удобно с того момента, как я начну иметь более одного стола, и я хочу сохранить другие.
3 ответов
просто позвони 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)
альтернатива вызову cls.__table__.drop(your_engine)
, вы можете попробовать это:
Base.meta.drop_all(bind=your_engine, tables=[User.__table__])
этот метод, а также метод create_all() принимают необязательный аргумент 'tables', который принимает итератор sqlalchemy.язык SQL.схема.Экземпляры таблицы.
вы можете контролировать, какие таблицы должны быть созданы или удалены таким образом.
Ниже приведен пример кода, который вы можете выполнить в iPython, чтобы проверить создание и удаление таблицы на Postgres
from sqlalchemy import * # imports all needed modules from sqlalchemy
engine = create_engine('postgresql://python:python@127.0.0.1/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 алхимии).