如何在表创建期间在SQLite中设置默认日期值

时间:2017-09-24 19:49:49

标签: python linux python-3.x ubuntu sqlite

寻求一些建议和帮助。我想将列值设置为默认为当前系统日期,如果没有日期值插入表中。我试图以两种不同的方式取得成功。第一个是下面。使用字符串格式并运行此代码,

current_date = datetime.now().strftime('%Y %m %d')
conn = sqlite3.connect("pipe_tally.db")

cur = conn.cursor()

def create_table():
    """This function creates the database table."""
    cur.execute("""CREATE TABLE tally_file (
        pipe_id TEXT PRIMARY KEY,
        kind TEXT,
        joint_num INTEGER,
        heat INTEGER,
        asset_length REAL CHECK(asset_length > 0),
        asset_wall_thickness REAL,
        asset_degree REAL,
        manufacturer TEXT,
        collected_date TEXT DEFAULT {}
        )""".format(current_date))
    conn.commit()

给我错误:

Traceback (most recent call last):
  File "main.py", line 18, in <module>
    main()
  File "main.py", line 11, in main
    db.create_table()
  File "/home/bigdaddy/PAM_Android/db_helper.py", line 25, in create_table
    )""".format(current_date))
sqlite3.OperationalError: near "09": syntax error

我猜这是09月,但我不理解这个错误。 第二种方法是尝试使用如下的元组:

import sqlite3
from datetime import datetime

current_date = datetime.now().strftime('%Y %m %d')
conn = sqlite3.connect("pipe_tally.db")

cur = conn.cursor()

def create_table():
    """This function creates the database table."""
    cur.execute("""CREATE TABLE tally_file (
        pipe_id TEXT PRIMARY KEY,
        kind TEXT,
        joint_num INTEGER,
        heat INTEGER,
        asset_length REAL CHECK(asset_length > 0),
        asset_wall_thickness REAL,
        asset_degree REAL,
        manufacturer TEXT,
        collected_date TEXT DEFAULT (?)
        )""", (current_date,))
    conn.commit()

然后运行返回:

Traceback (most recent call last):
  File "main.py", line 18, in <module>
    main()
  File "main.py", line 11, in main
    db.create_table()
  File "/home/bigdaddy/PAM_Android/db_helper.py", line 25, in create_table
    )""", (current_date,))
sqlite3.OperationalError: default value of column [collected_date] is not constant

使用SQLite可以实现这一点吗? 我使用的是Xubuntu Linux 16.04 LTS,Python3.6和SQLite3版本2.8.17 提前感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

您可以使用特殊符号CURRENT_DATE作为新插入行的默认值:

CREATE TABLE tally_file (
    [...],
    collected_date TEXT DEFAULT CURRENT_DATE
);

答案 1 :(得分:0)

我认为你只是错过了两个'

collected_date TEXT DEFAULT '{}'

下面的代码运行没有错误:

from datetime import datetime
import sqlite3

conn = sqlite3.connect(':memory:')
cur = conn.cursor()

current_date = datetime.now().strftime('%Y %m %d')
command = """CREATE TABLE tally_file (
        collected_date TEXT DEFAULT '{}'
        )""".format(current_date)

cur.execute(command)
conn.commit()
conn.close()

有一个类似的答案here

一般来说,现在是一个很好的决定,在今天的模式创建日期默认数据库,而不是一个非常特殊的任务(例如,数据库很快就存在)。我猜你会在插入时得到一个更清晰的默认值结果。