2016-09-24 27 views
1

SQLiteの場合、次のSQL文は何をしますか? time列がdocumentationにリストされていないSTRFTIMEタイプを有することSQLiteでのカスタムデータ型の動作

CREATE TABLE foo(id INTEGER PRIMARY KEY, time STRFTIME); 

注意。

私はこのための何らかのエラー

sqlite> INSERT INTO foo (time) VALUES('text'); 
sqlite> SELECT * FROM foo; 
1|text 

せずに、次のINSERT作品推測:

3.1。コラム親和性の決意

列の親和性を示すために、次の規則に従って、 列の宣言された型によって決定されます。宣言された型が文字列が含まれている場合

  1. 「INT INTEGERアフィニティが割り当てられます。

  2. 宣言された型の文字列に "CHAR"、 "CLOB"、または "TEXT"のいずれかの文字列が含まれる場合、その列はTEXT類似性を持ちます。 VARCHAR型に文字列 "CHAR"が含まれているため、TEXT アフィニティが割り当てられていることに注意してください。

  3. 列の宣言された型に文字列 "BLOB"が含まれているか、または 型が指定されていない場合、列は親和性BLOBを持ちます。

  4. 列の宣言された型に "REAL"、 "FLOA"、または "DOUB"のいずれかの文字列が含まれる場合、その列はREALアフィニティを持ちます。

5.それ以外の場合は、親和性が NUMERICです。

と、この:

NUMERIC親和性を有するカラムはすべて5つの ストレージ・クラスを使用して値が含まれていてもよいです。テキスト・データが数値列に挿入されると、テキストの記憶クラス は、変換が可逆で可逆である場合、INTEGERまたはREAL( の順)に変換されます。 TEXTストレージクラスとREALストレージクラス間の変換で の場合、最初の15 の小数点以下桁が保持されている場合、 は変換が可逆で可逆であるとみなされます。 TEXTからINTEGERまたはREALへの可逆変換が不可能な場合は、 の値がTEXTストレージクラスを使用して格納されます。 NULLまたはBLOBの値を変換しようとしていません

私はそうですか?

答えて

1

はい。 STRFTIMEは、FLUFFY BUNNIESと正確に同じ親和性、すなわち数値を有する。

0

新しい型を実装したい場合は、それでもsqliteプリミティブ型の1つに内部的に格納する必要があります。次に、Pythonからsqliteに変換する関数を提供する必要があります。ここで

は、実行する手順は次のとおりです。

  • 使用sqlite3.register_adapterのsqliteにPythonのタイプを変換する方法を指定します。 sqliteの内部/プリミティブ型(text、integer、real、blob、null)のいずれかに変換することはできますが、TEXTを使用して変換を行うことができます(次の点を参照)。
  • sqlite3.register_converterを使用して、sqliteの内部表現からPython型に変換する方法を指定します。
  • connect()を呼び出す場合は、detect_types=sqlite3.PARSE_DECLTYPES引数を指定します。
  • テーブルを作成するときは、カスタムタイプ名を使用します。

注:register_converterのドキュメントでは、バイトテキストから変換する必要があると言われています。ここで

がカスタム「日付」タイプ実装する例である:私は私の答えを入力している間

import sqlite3 
from datetime import date 

def date_to_str(d): # for python to sqlite 
    return '%04d%02d%02d' % (d.year, d.month, d.day) 
def str_to_date(s): # for sqlite to python 
    y=int(s[0:4]) 
    m=int(s[4:6]) 
    d=int(s[6:8]) 
    return date(y,m,d) 

sqlite3.register_adapter(date,date_to_str) 
sqlite3.register_converter('date',str_to_date) 

WEEKDAYS = { 
    0: "Mon", 1: "Tue", 2: "Wed", 3: "Thu", 4: "Fri", 5:"Sat",6:"Sun" 
} 
def test(): 
    s = sqlite3.connect('myfile.dat', detect_types=sqlite3.PARSE_DECLTYPES) 
    c = s.cursor() 
    c.execute('create table t1(id integer primary key, d1 date)') 
    c.execute('insert into t1 values(?,?)', (1, date(2016,9,24))) 
    c.execute('insert into t1 values(?,?)', (2, date(2000,1,1))) 
    s.commit() 
    for r_id, r_date in c.execute('select id,d1 from t1 order by d1'): 
    print r_id, r_date, r_date.year, r_date.month, r_date.day, WEEKDAYS[r_date.weekday()] 


if __name__ == '__main__': 
    test() 

を、私は受け入れ答えを読んで、これはあなたの質問ではないことに気づきました。しかし、これが他の人々を助けることができれば...

関連する問題