2017-11-29 21 views
0

cursor.executeを使用してDjangoプロジェクトで生のSQLクエリを実行しています。ここでPostgreSQLでのDjango/PythonとRaw SQLのクエリ

は私のジャンゴmodels.pyデータベーススキーマです:私は混乱してしまうのはここ

# \d+ client 

     Column  |   Type   |  Modifiers  | Storage | 
-------------------+--------------------------+--------------------+----------+ 
date_incorporated | timestamp with time zone | not null   | plain | 

だ:

私が使用している場合

class Client(models.Model): 
    date_incorporated = models.DateTimeField(default=timezone.now) 

そして、ここでは、テーブルのpsql説明がありますpsqlを使用してテーブルからデータをクエリすると、I ge t:

# SELECT date_incorporated FROM client; 

    date_incorporated  
------------------------ 
2017-06-14 19:42:15-04 
2017-11-02 19:42:33-04 
(2 rows) 

これは意味があります。 PostgreSQL docsでは、これは正しく書式設定され、UTCタイムスタンプとして格納されている文字列であることを示しています(確信しています)。私はこのクエリを使用してジャンゴを通過するとき

cursor.execute('SELECT date_incorporated FROM client;') 
data = [dict(zip(columns,row)) for row in cursor.fetchall()] 

using the dictfetchall method from the Django docs

...私date_incorporatedフィールドはpythonのdatetime対象になってます。私が構築しています。このアプリで

{'date_incorporated': datetime.datetime(2017, 11, 2, 23, 42, 33, tzinfo=<UTC>)} 

、私は、入力生のSQLのことができるようにするために、ユーザーを望んでいた、とcursor.execute(rawSQL)関数に入力された文字列を実行することを置きます。私は出力がpsqlバージョンと同じであることを期待しました。

私はDjangoのORMを使用していた場合、私は、タイムゾーンを意識datetimeオブジェクトに変換することがtimestamp with time zoneを期待してきたかもしれませんが、私は生のSQL呼び出しをやっているので、私は、2017-06-14 19:42:15-04戻っていない取得するために期待しましたPython datetimeオブジェクトです。

fetchallメソッドはまだDjango ORMとして動作し、特定のフィールドを変換していますか?

答えて

1

これは、任意のインターフェイスドライバを使用した標準的な変換だと思います。 py-postgressqlを使用しても同じ結果が得られます。つまり、カーソルはデータベースで定義されているフィールドタイプに従って変換を実行しています。

短くても、dictfetchallは変換を実行しておらず、変換された結果をカーソルから解析しています。

+0

ありがとうございます。そして、カーソルはあなたが言っているすべてのインタフェースドライバで標準ですか?おそらく[PEP 249](https://www.python.org/dev/peps/pep-0249/)からですか? – qarthandso

関連する問題