2016-11-06 15 views
2

SQLiteに日付(TEXTのデータ型として)を挿入したいと思います。これは私がセットアップしたものです:SQLiteに日付を挿入する

def create_table(): 
    c.execute('CREATE TABLE IF NOT EXISTS practice_data(date TEXT, distance REAL, duration REAL, avg_pace REAL)') 

date = str(input('Enter DATE (i.e. 2016-01-10): ')) 
distance = float(input('Enter TOTAL DISTANCE RAN (i.e 2.11): ')) 
duration = float(input('Enter TOTAL DURATION (i.e. 20.34): ')) 
avg_pace = float(input('Enter AVERAGE PACE (i.e. 10.44): ')) 

def data_entry(): 
    c.execute("INSERT INTO practice_data(date,distance,duration,avg_pace) VALUES ({}, {}, {}, {})".format(date, distance, duration, avg_pace)) 
    conn.commit() 
    c.close() 
    conn.close() 


create_table() 
data_entry() 

私はプログラムを実行するとうまくいきます。しかし、SQLite Browserを開くと、Date Columnが正しく表示されません。たとえば、「2016-11-06」と入力すると、「1999」と入力されます。なんらかの理由で、「 - 」が減算であることがわかります。その日付にはTEXTのデータ型が指定されていますが。

私はSQLiteにdatetimeオプションがあるのを見ましたが、実装方法はわかりません。

答えて

1

raw_inputを使用します。 Pythonの2本のラインで

:あなたは2016-11-06を入力した場合

date = str(input('Enter DATE (i.e. 2016-01-10): ')) 

結果dateでは、1999年割り当てられている、とPython 2が入力を評価するためです。

  • 利用raw_input()代わりのinput()

    が2つのソリューションがあります。 raw_input()は評価せずに文字列を返します。

    >>> n = input('? ') 
    ? 1+2+3+4 
    >>> n 
    10 
    >>> n = raw_input('? ') 
    ? 1+2+3+4 
    >>> n 
    '1+2+3+4' 
    
  • 使用のPython 3

EDIT

をあなたは上記は適用されないのPython 3を使用しているので。

他の問題は、あなたが書式設定文字列を使用してクエリを構築する方法が原因である:

c.execute("INSERT INTO practice_data(date,distance,duration,avg_pace) VALUES ({}, {}, {}, {})".format(date, distance, duration, avg_pace)) 

これは、クエリを実行します:

INSERT INTO practice_data(date,distance,duration,avg_pace) VALUES (2016-11-06, 1, 2, 3) 

とSQLiteは2016-11-06を評価し、その結果を挿入します。

次のようなテキストフィールドを引用してこの問題を解決できます。

c.execute("INSERT INTO practice_data(date,distance,duration,avg_pace) VALUES ('{}', {}, {}, {})".format(date, distance, duration, avg_pace)) 

ができますが、それはSQLインジェクションの脆弱性につながることができてはならないと。代わりに、文字列の書式を使用のクエリをパラメータ化:

c.execute("INSERT INTO practice_data(date,distance,duration,avg_pace) VALUES (?, ?, ?, ?)", (date, distance, duration, avg_pace)) 

これは、フィールドのプレースホルダ(?)を使用し、DBエンジンは、必要に応じて適切な値を引用し、エスケープ、安全な置換を実行します。

+0

私は現在Python3.5を使用しています。私は先に進んでinput()をraw_input()に変更し、Python 2.7で実行しました。しかし、私は「 - 」を減算として解釈するのと同じ結果を得ています。 – kstullich

+0

パーフェクト!ありがとう! – kstullich

1

2.xではinputが入力文字列(2016-11-6 == 1999)を評価するため、Python 2.xを使用しているようです。

あなたはSQLiteのが原因でどちらも2つの問題があります(3.xのためにあなたがinputを使用する必要があります)の代わりに

+0

私は現在Python3.5を使用しています。私は先に進んで 'input()'を 'raw_input()'に変更し、Python2で実行しました。しかし、私は「 - 」を減算として解釈するのと同じ結果を得ています。 – kstullich

関連する問題