1. ホーム
  2. python

[解決済み] SQLAlchemy でテーブルを削除する方法は?

2022-02-05 07:55:22

質問内容

SQLAlchemyを使って、テーブルを削除したいのですが。

何度も何度もテストしているので、テーブルを削除したい。 my_users 毎回ゼロから始められるように。

今のところ、私は SQLAlchemy を使って、生の SQL を engine.execute() メソッドを使用します。

sql = text('DROP TABLE IF EXISTS my_users;')
result = engine.execute(sql)

しかし、何か標準的な方法はないものだろうか。私が見つけた唯一のものは drop_all() しかし、それは特定の1つのテーブルだけでなく、すべての構造を削除します。

Base.metadata.drop_all(engine)   # all tables are deleted


例えば、この非常に基本的な例を考えてみましょう。これは、1つのテーブルを持つ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() しかし、複数のテーブルを持つようになったとき、他のテーブルも残しておきたい場合には不便になります。

どのように解決するのですか?

を呼び出すだけです。 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)