2017-09-24 11 views
0

私はSQLAlchemyを使ってFlask Webアプリケーションを持っています。本番環境でバックアップするデータベースはPostgresですが、単体テストのためにSQLiteに対して初期化することもできます。モジュールレベルのオブジェクトを選択的に初期化する方法は?

データベーススキーマの変更にはalembicを使用します。この理由から、私は生産のためにSQLiteをサポートしないことに決めました。なぜなら、alembicサポートを作ることは、SQLiteが私が望むよりもトラブルが多いからです。しかし、私はまだテスト目的のために、SQLiteの中で最初からテーブルを作成できるようにしたい。これはalembicを起動しませんが、SQLAlchemyのcreate_all()を使用するだけです。

私は宣言的モデルを使用していて、その文書で提案されているように、より良いアレンビック作品を作るために、私は制約の命名規則を設定しました:

naming = { 
    "ix": 'ix_%(column_0_label)s', 
    "uq": "uq_%(table_name)s_%(column_0_name)s", 
    "ck": "ck_%(table_name)s_%(constraint_name)s", 
    "fk": "fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s", 
    "pk": "pk_%(table_name)s", 
} 

Base = declarative_base(metadata=MetaData(naming_convention=naming)) 

class Model1(Base): 
    ... 

これはPostgresの内部に正常に動作しますが、失敗しましたSQLiteで;明らかに命名規則は何らかの形で互換性がありません。 (これは私のモデルの中にはBooleanという列があり、2つのエンジンで異なるように扱われていることが明らかです)

私は実際にはSQLiteをプロダクションに必要とせず、そこではalembicを使用できませんでした私はそのような場合に命名規則を削除し、テストを実行するときにデフォルト名を使用させたいと思っています。しかし、これはすべてモジュールトップレベルで行われているので(Baseをベースクラスとして使用するためには)、この区別をする方法を見つけることができません。理想的には、モデルをインポートする前にテストスイートで何らかのフラグを設定すると、命名規則を有効にするのではなく、デフォルトのメタデータでBaseを作成します。しかし、私はインポート時にこのコミュニケーションを行う方法を見つけることができません。

インポート時に宣言ベースの作成を制御するには、どのようにデータを渡すことができますか?あるいは、簡単にSQLiteを命名規則を有効にして動作させる方法はありますか?

+2

設定ファイルはどうしますか? – georgexsh

+0

可能です。理想的には、単体テストの実行と完全な開発サーバーの実行の間で手動でファイルを変更する必要はありませんが、テストスイートでファイルを書き出すことができます。 –

+1

また、テストランナーがコードを検出している可能性があります。たとえば、pytestの場合は、 'PYTEST_CURRENT_TEST'を確認してください。environ:https://docs.pytest.org/en/latest/example/simple.html#pytest-current-test-environment -variable – georgexsh

答えて

0

私はこれを解決するために、環境変数を使用しました。プロジェクトのモジュールで:テストハーネスで次に

if os.environ.get('MYPROJECT_TESTING') == '1': 
    Base = declarative_base() 
else: 
    Base = declarative_base(metadata=MetaData(naming_convention=naming) 

os.environ['MYPROJECT_TESTING'] = '1' 
import myproject 

あなたがシェル環境でのセットをMYPROJECT_TESTING残していないことを確認する必要があり、またはこれまでにそれを設定するが、これは、正常に動作しますテストスクリプトに自動的に以外の一般的なもの

関連する問題