2017-09-24 164 views
1

寻找一些建议和帮助。如果没有将日期值插入表中,我想将列值设置为当前系统日期的缺省值。我以两种不同的方式尝试了成功。第一个在下面。使用字符串格式化,并运行此代码,如何在表创建期间在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版本 在此先感谢您的帮助。

+0

什么是“电流”是指,创建表或行插入? –

+0

@CL。我希望“当前”意味着行插入。对不起,没有澄清。 – J2112O

回答

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

一般情况下,现在是一个很好的决定,在创建模式时默认数据库的当前日期,更不用说它是一个非常特定的任务(例如,数据库的寿命非常短hortly)。我猜,在插入时你会得到一个更清晰的结果,并带有默认值。

+0

谢谢@ Evgeny Pogrebnyak。这适用于没有错误的表创建。现在我知道我需要在行插入级别实现这一点。 – J2112O

1

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

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

这也适用于@CL。谢谢 – J2112O

相关问题