2017-09-20 5 views
0

こんにちはパイソン/ SQLiteの専門家、PythonのSQLiteの日時書式は、私は自分自身に説明することはできません非常に奇妙な行動を持って

を無視しました。たぶん、次のことができます。 私は一つだけのテーブルでのsqliteのDBがあります

CREATE TABLE testme (
    id  INTEGER PRIMARY KEY AUTOINCREMENT 
        UNIQUE 
        NOT NULL, 
    dataId STRING NOT NULL, 
    Sender STRING NOT NULL, 
    Value DECIMAL NOT NULL, 
    Date DATETIME NOT NULL 

を)。 Pyhtonと

私はcsvファイルからいくつかのデータを追加しました:その後

import csv 
import sys 
import sqlite3 as lite 

con = lite.connect('data.db3') 
f = open('Export_378334000.csv', 'rt') 
cur = con.cursor() 
cur.execute("delete from data1") 
con.commit() 
cur.execute("vacuum") 
con.commit() 
try: 
    reader = csv.reader(f, delimiter="\t") 
    for row in reader: 
     print ("Name: " + row[0]) 
     print ("Betrag: " + row[6]) 
     print ("Datum: " + row[9]) 
     print ("id: " + row[21]) 
     cur.execute("INSERT INTO data1 (dataid,sender,value,date) VALUES ('" + row[21] + "','" + row[0] + "','" + row[6] + "','" + row[9] + "')") 
    con.commit() 

finally: 
    con.commit() 
    f.close() 

を私は日付の列の文字列のエントリを持つ行を見つけ....:

Name: Name 1 
Betrag: Betrag 
Datum: Wertstellungsdatum 
id: Buchungs-ID 

どのようにすることができます日付行のエントリがdatetimeで認識されているかどうかを確認してください。

+0

Wertstellungsdatum:テーブルを作成する場合は、ルールをチェックする設定されていますか? –

+2

SQLiteは、データに関係なく、任意の列に何かを受け入れます。文字列を整数に、整数を日付時間に挿入することができます。例外は、列がNOT NULLとして定義されている場合にのみNULLを持つことです。 さらに、Pythonのsqliteはデータを挿入するためのプレースホルダを受け取ります。https://docs.python.org/3/library/sqlite3.html#cursor-objects – MrGumble

+0

を参照してください。入力データがあなたの期待するものではない –

答えて

0

コメントで既に述べたように、SQLiteはデータに関係なく任意の列に何かを受け入れます。そのため、datetimeに文字列を含む行が見つかりました。

どのように日付行の私のエントリは、日時が

を認識している。しかし、あなたが正しい日時フォーマットを持つ唯一の値は、彼の列のために受理されることを保証するための制約を定義することができる場合、私は証明することができます。それはあなたが日時のCSVまたはちょうど交換に印刷された文字列である -

d DATE CONSTRAINT date_format_check CHECK (DATE(d) IS NOT NULL) 

create table test (
    test_date DATE CONSTRAINT date_format_check CHECK (date(test_date) is not NULL) 
) 

insert into test values ('2017-01-01'); 
insert into test values ('oops!'); 
select * from test 
+0

'CONSTRAINT ... CHECK'は' CONSTRAINT UNIQUE'と同様に 'ON CONFLICT'節を許可しないというのは興味深いことがわかります。 – MrGumble

+0

@MrGumble、面白いメモ、ありがとう –

関連する問題