【发布时间】:2022-01-17 16:45:35
【问题描述】:
我正在使用flask-restful,用户可以发布一些必需的和一些可选的数据,我想用这些数据创建一个SQLite 插入语句。问题是我不想通过使用变量作为列名并检查哪个参数是None 以及哪个有一些数据来破坏 sql 语句。我希望我可以只使用所有列,当 arg2 或 arg3 为None 时,数据库将使用列默认值。可悲的是,我收到了NOT NULL constraint failed: mytable.col1 的消息。使用我的方法从表创建中删除 NOT NULL 只会在使用我的语句时插入 NULL。
是否有明确的方式告诉 SQLite 使用其默认值?
如果没有,是否有更优雅的方式来获取默认值而不是执行某些表模式查询?
如果没有并且不存在其他解决方案,那么屠宰 sql 语句的最有效方法是什么?
parser_post = reqparse.RequestParser()
parser_post.add_argument('arg1', type=str, required=True)
parser_post.add_argument('arg2', type=str)
parser_post.add_argument('arg3', type=str)
args = parser_post.parse_args()
# ... db init code
cur.execute("insert into mytable (col1, col2, col3) values (?, ?, ?)",
(args['arg1'], args['arg2'], args['arg3']))
表是这样创建的:
sql = """CREATE TABLE mytable (
PK_id INTEGER PRIMARY KEY AUTOINCREMENT,
col1 INTEGER NOT NULL,
col2 TEXT DEFAULT "global" NOT NULL,
col3 TEXT DEFAULT "global" NOT NULL)"""
cursor.execute(sql)
【问题讨论】:
-
为什么不创建一个包含“args”条目以及缺失条目的默认值的字典?然后可以将此字典用作参数化 SQL 语句的基础。
-
@MichaelButscher 可以工作,但它在客户端代码中重复数据库端值:容易不同步。
-
@MichaelButscher 加上默认值?这意味着我需要以某种方式从数据库表信息中查询它们(因为硬编码它们是不行的),这也不是最优的。
标签: python sql python-3.x database sqlite