データベースのクエリだけでなく、テーブルの作成にも SQLAlchemy ORM を使用したいと考えています。したがって、データベースの空のスキーマに接続します。
engine = create_engine(connection_string)
Base = declarative_base()
次の例のようなクラスがいくつかあります。
class SomeClass(Base):
__tablename__= 'SomeClass'
id = Column(Integer, primary_key=True, auto_increment=True)
name = Column(String(50))
def __init__(self, name):
self.name = name
私が呼び出すデータベースを作成するには:
Base.metadata.create_all(engine)
これはうまくいきます - 初めてです。データベースからテーブルを手動で削除するかBase.metadata.drop_all()
、スクリプトを呼び出して再起動すると (したがって、create_all
再度呼び出します)、テーブルが既に存在するというエラーが表示されます。
sqlalchemy.exc.OperationalError: (OperationalError) (1050, "Table 'someclass' already exists")
これは真実ではないとはっきり言えます。CLI ツールから CREATE TABLE を使用して同じ名前のテーブルを作成できます。また、データベースデーモンを停止して再度起動すると、.create_all
これは、SQLAlchemy とデータベースの間の接続に関係していると思います。明らかに、SQLAlchemy は、削除した後もテーブルがまだ存在していると考えていますが、これは正しくありません。しかし、この存在しないテーブルをクエリしようとすると、テーブルが存在しないことがわかります。
グーグルで調べましたが、この動作の説明を見つけることができませんでした。私は SQLAlchemy をあまり頻繁に使用しないので、問題を理解するのに十分なほど詳しくないのかもしれません。
とにかく、ヒントをいただければ幸いです。
Python 2.7.3とMySQL 5.1.47とSQLAlchemy 0.8.0b2を使用しています
PS: Postgres を使用して、このような問題に悩まされたことはありません。