1

pyodbcを使用して、さまざまなodbc準拠のデータベースに接続しています。

MySqlデータベースに名前、年齢、国籍が含まれているとします。今、私の要件は、たとえば次のように、レコードを含む辞書を作成する必要があることです。

{'Name' : 'a', 'Age' : '20'} 

pyodbcオブジェクトのexecute()メソッドで指定されたクエリの場合。

「名前」、「年齢」などの列ヘッダーを取得するために行ったことは、選択クエリから新しいテーブルを作成してから使用したことです。

select column_name from information_schema.columns where table_name=xxx

列ヘッダーを取得します。クエリ'テーブルの作成'、'テーブルの削除'、および'列名の選択....'コマンドがすべてodbc準拠のデータベースで同じであるかどうかはわかりません。PostgreSqlとMySqlをチェックしましたが、正常に機能しますが、それらが異なる場合は、実装を変更する必要があり、次のようになります。

if mysql:
    execute(this)
if posegresql:
    execute(this)
if ibmdb2:
    execute(this)

上記のクエリがすべてのデータベースで同じである場合、問題はありませんが、それらが異なる場合、簡単で効率的な解決策は何でしょうか。

4

2 に答える 2

2

1つの質問に多くの問題があります。

最初に、いくつかのものを標準化する DB-API があり、そのうちの 1 つはdescriptionで取得した列のものですSELECT。そのようなものには使用information_schemaしないでください。他のテーブルの列を使用する場合、または単に表示する場合は何を表示しCOUNT(*)ますか? これは、列名を取得するために使用する方法です( Northwind MS Accessデータベースdescriptionで試しました):pyodbc

rs = c.execute("SELECT * FROM Categories")
cols = [d[0] for d in rs.description]
print(cols)
for rs in c.fetchall():
    print(rs)

SQLに関しては、いいえ、すべてのデータベースには独自の方言があります。一部は共通ですが、多くの違いがあります。たとえば、日時文字列はまったく異なる場合があります。

もちろん、DAL 経由でデータベースを使用することもできます: https://en.wikipedia.org/wiki/Database_abstraction_layerですが、web2py の DAL のみを使用しました。データベースに依存しない、より大きなものを構築したい場合は、そのような既存の DAL を使用するのが最も簡単だと思います。ODBC や JDBC などの同様の標準は、データベースに接続し、クエリを実行したり、他のステートメントを実行したり、メタデータ (列名など) をチェックしたりするための唯一の方法ですが、SQL 方言の違いを隠すことはできません。

于 2012-06-19T09:29:36.190 に答える
1

@Michał Niklas が述べたように、カーソルの説明変数は、列のメタデータを取得するための最良の方法です。

列名と行の値をまとめた辞書のリストを作成するには (pyodbcがロードされ、データベース接続が確立され、カーソルが であると仮定しますc):

rs = c.execute("SELECT * FROM Categories")
cols = [d[0] for d in rs.description]
results = []
for row in c.fetchall():
    results.append(dict(zip(cols,row)))
于 2012-06-20T14:16:11.717 に答える