39

私はフラスコのsqlalchemyモデルを持っています:

class MyModel(db.Model):
__tablename__ = 'targets'
id = db.Column(db.Integer, primary_key=True)
url = db.Column(db.String(2048))

テーブルはすでに作成されており、使用中です。url 属性にインデックスを作成したいので、 index=True を渡します。

url = db.Column(db.String(2048), index=True)

テーブルを削除して再作成せずに、このインデックスを有効にするにはどうすればよいですか?

4

7 に答える 7

48

元の質問のモデル クラスが与えられます。

class MyModel(db.Model):
    __tablename__ = 'targets'
    id = db.Column(db.Integer, primary_key=True)
    url = db.Column(db.String(2048))

index=Trueインデックスを呼び出しdb.Model.metadata.create_all()ても、作成済みのテーブルには作成されないため、単に追加することはできません。

Index代わりに、独立したオブジェクトを作成してから作成する必要があります。次のようになります。

class MyModel(db.Model):
    __tablename__ = 'targets'
    id = db.Column(db.Integer, primary_key=True)
    url = db.Column(db.String(2048))

mymodel_url_index = Index('mymodel_url_idx', MyModel.url)

if __name__ == '__main__':
    mymodel_url_index.create(bind=engine)

どこengineから来るかは sqlalchemy の設定次第ですが、このコードは何が起こる必要があるかの要点を伝えるはずです。

于 2016-12-21T03:03:08.587 に答える
2

create()インデックスを呼び出す:

index.create()

http://docs.sqlalchemy.org/en/latest/core/constraints.html#sqlalchemy.schema.Index.create

于 2013-05-24T13:45:29.400 に答える
2

これは不正確で複雑すぎる回答であることに注意してください

ここindex.createで言われたように使うのが正しいやり方です。


まず、データベースの最新のスナップショットがあり、このスナップショットからデータベースを復元できることを確認してください。

中規模および大規模なプロジェクト (同時に複数のバージョンをサポートする必要があり、複数の環境にインストールされるプロジェクト) には、「データベース移行」と呼ばれるデータベース管理ライフサイクルの一部である特別な手順があります。DB の移行には、既存のスキーマへの変更が含まれます。SQLAlchemy はそのままでは移行をサポートしていません。

SQLAlchemy と互換性のあるデータベース移行ツールが 2 つあります。

これらのツールの詳細とリンクについては、SQLAlchemy ドキュメント ページのAltering Schemas through Migrations を参照してください。

ただし、小規模なプロジェクトで作業している場合は、データベース コマンド ライン ユーティリティから、または Python スクリプトで connection.execute() を介して ALTER TABLE DDL クエリを手動で実行することをお勧めします。

私が現在取り組んでいる本番アプリケーションでは、アプリケーションの最新バージョンを 1 つだけサポートしています。データベース スキーマの変更ごとに、次の手順を実行します。

  • 本番データベースのスナップショットを作成する
  • このスナップショットを開発環境にロードする
  • sqlalchemy データ モデル モジュールの更新
  • テーブル変更クエリを準備して実行し、後で使用するためにこのクエリを保存します
  • コードに他の関連する変更を加える
  • 開発環境でテストを実行する
  • コードの最新バージョンを本番環境にデプロイする
  • 本番環境でテーブルを変更する

また、テーブル/インデックス作成クエリを生成するために次のトリックを使用しています。アプリケーションを新しいデータベースにポイントし、sqlalchemy クエリのログを有効にして実行します。metadata.create_all()そのため、ログ (または STDOUT) に、sqlalchemy によって生成されたクエリの作成が表示されます。

使用しているデータベース システムによって、インデックス作成クエリは少し異なります。一般的なクエリは次のようになります。

create index targets_i on targets(url);
于 2013-01-20T02:43:06.633 に答える