【发布时间】:2016-06-25 10:08:13
【问题描述】:
我想使用 SQLAlchemy 删除一个表。
由于我一遍又一遍地测试,我想删除表my_users,这样我每次都可以从头开始。
到目前为止,我正在使用 SQLAlchemy 通过 engine.execute() 方法执行原始 SQL:
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() 会起作用,但从我开始拥有多个桌子并且我想保留其他桌子的那一刻起,它就不方便了。
【问题讨论】:
-
注意:必须在
text(...)中包围 sql 查询才能正常工作。如果省略,则 SQLAlchemy 不起作用,并且它不会提供任何关于它为什么不起作用的反馈。
标签: python sqlite sqlalchemy drop-table