我想使用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 将不起作用,也不会提供任何反馈来解释为什么没有工作。 - Contango