2016-11-06 127 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