2016-09-24 3 views
1

SQLite의 경우 다음 SQL 문은 무엇을 수행합니까? time 열이 documentation에 나열되지 않은 STRFTIME 유형이 있는지SQLite에서 사용자 정의 데이터 유형 작동 방법

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

참고.

3.1 :

가 나는 오류이 때문에

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

없이 INSERT 작품을 다음과 같은 추측. 열 선호도의 결정

열의 선호도가 표시된 순서대로 다음과 같은 규칙에 따라 열에 선언 된 유형에 따라 결정됩니다 : 선언 된 유형이 문자열을 포함하는 경우

  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 저장소 클래스를 사용하여 저장됩니다. 시도는 바로 암 I을 NULL 또는 BLOB 값

을 변환 을하지입니까?

답변

1

예; STRFTIMEFLUFFY BUNNIES과 정확히 동일한 어피 니티, 즉 숫자를가집니다.

0

새 유형을 구현하려는 경우에도 여전히 sqlite 기본 유형 중 하나에 내부적으로 저장해야합니다. 그런 다음 파이썬에서 sqlite로 또는 그 반대로 변환하는 함수를 제공해야합니다. 여기

이 단계를 수행 할 수 있습니다 :

  • 사용 sqlite3.register_adapter 파이썬 유형 SQLite는로 변환하는 방법을 지정합니다. sqlite 내부/원시 유형 (텍스트, 정수, 실수, blob 및 null) 중 하나로 변환 할 수 있지만 TEXT를 사용하여 역으로 변환 할 수 있어야합니다 (다음 참조).
  • sqlite3.register_converter을 사용하여 sqlite 내부 표현을 파이썬 유형으로 다시 변환하는 방법을 지정하십시오.
  • 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() 

내가 내 대답을 입력하는 동안을, 내가 허용 대답을 읽고,이 질문이 아니었다 깨달았다. 그러나 이것이 다른 사람들을 도울 수 있다면 ...

관련 문제