2016-11-06 124 views
2

我想在SQLite中插入日期(作爲數據類型的文本)。這是我的設置:在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瀏覽器時,日期列將不正確。例如,如果我輸入「2016-11-06」,它將輸入「1999」。出於某種原因,它暗示' - '是減法。即使我已指定該日期的數據類型爲TEXT。

我已經看到,SQLite有一個日期時間選項,但我不知道如何實現它。

回答

1

有2個問題,這兩者都不是由於SQLite的。

在Python 2這一行:

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

結果date被分配1999年,如果你進入2016-11-06,這是因爲Python 2評估輸入。

有2個解決方案:

  • 使用raw_input(),而不是input()。由於您使用Python 3以上不適

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

編輯

raw_input()將返回一個字符串沒有評價。

的另一個問題是由於您使用的字符串格式構造查詢方式:

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)) 

這將使用佔位符(?)的字段,數據庫引擎將執行安全替代,適當引用,並根據需要轉義值。

+0

我目前使用Python3.5。我繼續前進並將input()更改爲raw_input(),並在Python 2.7中運行它。但是我仍然將它解釋爲' - '的結果與減法相同。 – kstullich

+0

完美!修復了這個問題,謝謝! – kstullich

1

它看起來像你使用Python 2.x,因爲在2.x input評估輸入字符串(2016-11-6 == 1999)。

你想用raw_input代替(用於3.x的你應該使用input

+0

我目前正在使用Python3.5。我繼續並將'input()'改爲'raw_input()'並在Python2中運行它。但是我仍然將它解釋爲' - '的結果與減法相同。 – kstullich