Python 在SQLite中插入日期
我想在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
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
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中运行它。但我还是得到了同样的结果,将“-”解释为减法。