2016-12-22 11 views
0

私は間違いなく私が見落としている賢明な解決策を持っています。私はPythonプロジェクトをsqlite3を使用していました。これは大変好きで、常に使用しています。スケーリングが問題になる場合には、postgresで実行することもサポートしたいと思っていました。Pythonのsqlite3とpyscopgに同じ置換文字を使用しますか?

実際にはPythonデータベースの抽象化レイヤーが実際には1つもないことが示唆されていますが、psycopg2は幸いなことにsqlite3とよく似た構造とメソッドを持っているようですいくつかのヘルパー関数を追加して既存のコードにケースを切り替えて、同じクエリを使用して両方のデータベースライブラリをサポートできるようにすることができます。

唯一の例外は、信じられないほど、変数の置換文字です。 sqlite3は?、psycopg2は%sが必要です。これらはおそらく、私が知っているすべてのsqliteとpostgresに固有のものです。

cur.execute("INSERT INTO repositories (repository_url, repository_name, repository_type, repository_thumbnail, last_crawl_timestamp, item_url_pattern) VALUES (%s,%s,%s,%s,%s,%s)", (repository_url, repository_name, repository_type, repository_thumbnail, time.time(), item_url_pattern)) 

だけPostgresのために働くだろう、と私はさんに、%sの年代を変更した場合、それが唯一のsqliteのために働くだろう?

これは、このような機能があることを意味します。これはどんな種類のエレガントな解決法にも反しています。私は実際にクエリを作成するために何らかの文字列置換を試してみたいとは思いません。私のブロッカーになる。

どのような考えですか?

+0

"事実上のPythonデータベースの抽象化レイヤー" - [SQLAlchemy?](http://www.sqlalchemy.org/) – jwodder

答えて

1

どちらの実装でも使用されているAPIは、PEP 249に記載されているPython Database API Specification v2.0です。モジュールglobal paramstyleは、特定の実装が期待するパラメータのスタイルを示します。可能な値と意味はhereと記載されています。

+0

OK、私が設定したものに応じてパラメタを直接オーバーライドすることができます。 dbtype'変数は、すべての単一のクエリにケースブロックを追加する必要はありませんか? – serilain

+0

いいえ、定数です。無効にすることはできません。 SQLAlchemyのような上位レベルのAPIは、dbs間の簡単なモビリティを気にするなら、まともな選択肢です。このようなソリューション(ほとんどの場合オンラインで見つけることができますが)はかなり脆弱ですが、小さくてシンプルなものはハックすることができます。同様に、一度変換すると(sqliteからpgに戻り、戻ってこない)比較的小さなものに対しては、検索と置換がその仕事をします。 – pvg

+0

OK、ありがとう!私は最初にSQLAlchemyを使用していたはずですが、これはまだまだ愚かなことのように感じられます。しかたがない。 – serilain

関連する問題