Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在SQLite中插入日期_Python_Sql_Sqlite - Fatal编程技术网

Python 在SQLite中插入日期

Python 在SQLite中插入日期,python,sql,sqlite,Python,Sql,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('Ent

我想在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”。出于某种原因,假定“-”是减法。即使我已经指定日期的数据类型为文本


我已经看到SQLite有一个datetime选项,但我不知道如何实现它

看起来您使用的是Python2.x,因为在2.x
input
中,计算输入字符串(2016-11-6==1999)


您想改用
raw\u input
(对于3.x,您应该使用
input

有两个问题,这两个问题都不是由于SQLite造成的

在Python 2中,这一行:

date = str(input('Enter DATE (i.e. 2016-01-10): '))
如果输入
2016-11-06
,则会导致指定1999年的
date
,这是因为Python 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

编辑

由于您使用的是Python3,因此上述内容不适用

另一个问题是由于使用字符串格式构造查询的方式造成的:

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引擎将执行安全替换,根据需要正确引用和转义值。

我目前使用的是Python3.5。我继续将
input()
更改为
raw\u input()
,并在Python2中运行它。但是我仍然得到了相同的结果,将“-”解释为减法。我目前正在使用Python3.5。我继续将input()更改为raw_input(),并在Python 2.7中运行它。但我还是得到了同样的结果,将“-”解释为减法。