2016-09-24 35 views
1

以下SQL語句在SQLite的情況下做了什麼?自定義數據類型如何在SQLite中工作

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

注意,time柱具有未在documentation列出的STRFTIME類型。

我想,下面的INSERT作品沒有任何錯誤

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

因爲這樣:

3.1。測定柱親和力

列的親和力是通過聲明的類型的 柱的根據按所示順序的以下規則確定,:

  1. 如果聲明類型包含字符串「INT 「那麼它被分配 INTEGER親和力。

  2. 如果列的聲明類型包含任何字符串「CHAR」, 「CLOB」或「TEXT」,那麼該列具有TEXT關聯。請注意, 類型的VARCHAR包含字符串「CHAR」,因此被指定爲TEXT 親和力。

  3. 如果某個列的聲明類型包含字符串「BLOB」,或者沒有指定類型,則該列具有親和性BLOB。

  4. 如果列的聲明類型包含任何字符串「REAL」, 「FLOA」或「DOUB」,則該列具有REAL關聯。

5.否則,親和力是NUMERIC

和此:

與NUMERIC親和力可能包含使用所有五個 存儲類值的列。當文本數據插入NUMERIC列時,文本的存儲類將轉換爲INTEGER或REAL(優先級爲 ),如果此類轉換是無損和可逆的。對於TEXT和REAL存儲類之間的 轉換,SQLite認爲 的轉換是無損和可逆的,如果保留數字的前十位數。 如果無法將TEXT無損轉換爲INTEGER或REAL,則 值將使用TEXT存儲類存儲。沒有嘗試 向右轉換NULL或BLOB值

我是誰?

回答

1

是; STRFTIMEFLUFFY BUNNIES具有完全相同的親和力,即數字。

0

如果你想實現一個新類型,它仍然必須在內部存儲在一個sqlite基元類型中。然後你必須提供函數來從python轉換爲sqlite,反之亦然。

下面是步驟來執行:

  • 使用sqlite3.register_adapter指定如何轉換Python類型對於SQLite。雖然你可以轉換爲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() 

當我輸入我的回答,我讀了公認的答案,並意識到這不是你的問題。但是,如果這可以幫助其他人...

相關問題