2017-11-13 6 views
0

(多少の)データベースに依存しないモジュールを作成しようとしています。私はピービーモデルを定義し、データベースオブジェクトのinitメソッドを使用して実行時にデータベースに接続したいと考えています。異なるデータベースバックエンドのpeeweeデータベースの実行時の初期化

私はSqlite接続文字列を渡すと、これは期待通りに機能します。

>>> app.db.init('sqlite://mydb.sqlite') 

データベースに接続すると、すべて正常に動作します。しかし、postgresの接続文字列で同じものを試してみるとエラーになります。

>>> app.db.init('postgresql://username:[email protected]/mydb') 
... 
peewee.OperationalError: FATAL: database "postgresql://username:[email protected]/mydb" does not exist 

個別のパラメータを使用すると、initメソッドを接続できます。

>>> app.db.init('mydb', username='username', password='password') 

しかし、これは異なるデータベースバックエンド間ではうまく翻訳されません。

誰でも接続URIを扱うためにinitを取得する正しい方向を指摘できますか?

+0

SqliteDatabase initの最初の引数はデータベースファイル名であり、私の最初の例はデータベースURIを使用していないため、Sqliteメソッドが動作するようになっています。 しかし、特にここの文書 - http://docs.peewee-orm.com/en/latest/peewee/database.html#connecting-using-a-database-urlここ - http://docs.peewee -orm.com/en/latest/peewee/playhouse.html#db-urlは、 'playhouse.db_url.connect'関数を使用してデータベース接続を返し、それを' db.init'に渡すことができることを示しています。それ以外はエラーも発生します。 – andy47

答えて

0

ピーウィーの作者との何らかの相互作用した後、答えがProxyオブジェクトを使用することであると思われる - 私のモデルのモジュールでhttp://docs.peewee-orm.com/en/latest/peewee/database.html#dynamically-defining-a-database

私が行います。

database_proxy = pw.Proxy() 
... 
class Blah(pw.Model): 
    column_one = pw.CharField() 

    class Meta: 
     database = database_proxy 

次に実行時に接続します。

>>> from playhouse.db_url import connect 
>>> import models 
>>> db = connect('postgresql://username:[email protected]/mydb') 
>>> models.database_proxy.initialize(db) 

次に、モデルオブジェクトと正常にやり取りできます。このようにして、私は異なるデータベースバックエンド間で切り替えることができ、それらの間で切り替えるためにアプリケーションの設定で接続URL文字列を持つだけです。

0

私はこれを行う方法を考え出しました。それは誰かがより良い提案を持っている場合、私はすべての耳ですので、ちょっとclunkyです。私はconnectオブジェクトを作成し、その属性をdb.initに渡しています。このように

>>> from playhouse.db_url import connect 
>>> import models 
>>> db = connect('postgresql://username:[email protected]/mydb') 
>>> models.db.init(db.database, **db.connect_kwargs) 

これは有効なPeeweeバックエンドで動作するようです。

+0

Sqliteでは動作しません。上記の例の接続文字列を 'sqlite:/// Users/andy47/temp_db.sqlite'に変更すると、すべてのステートメントが実行されます。モデルを試してみるとすぐにエラーメッセージが表示されます。 'OperationalError:FATAL:database" Users/andy47/temp_db.sqlite "は存在しません。 – andy47

関連する問題