gpt4 book ai didi

python-2.7 - SQLite3 : Using try: except: to establish db table & default data set - kosher?

转载 作者:行者123 更新时间:2023-12-01 16:24:03 24 4
gpt4 key购买 nike

我已经为 sqlite3 数据库表编写了以下初始化例程,但有些东西告诉我这是 a)脆弱的,和/或 b)只是一个坏主意(tm)。

这个概念是,如果表不存在或者尚未初始化,则 try block 将出错并且将创建数据。在初始测试中,这是有效的 - 尽管我在脚本运行时没有看到打印到控制台的默认值:我打印了一个空元组。使用 sqlite shell 检查数据库,我看到数据存在。

但是这种令人烦恼的感觉挥之不去,因为这种方法有问题。想法?意见?建议?

import sqlite3 as lite
import sys


def insert_defaults():

conn = lite.connect('db.sqlite')
with conn:
cur = conn.cursor()
defaults = (
('mykey','value for key one'),
('anotherkey','value for key two')
)
cur.executemany("INSERT INTO Settings(key,value) VALUES ( ?, ? )", defaults)


def initialize():

conn = lite.connect('db.sqlite')

settings = ()

try:
conn.row_factory = lite.Row
cur = conn.cursor()

cur.execute("SELECT * FROM Settings")

if cur.rowcount < 1:
insert_defaults()
cur.execute("SELECT * FROM Settings")

settings = cur.fetchall()

except lite.Error, e:

print "Error: %s" % e.args[0]
print "Trying to create missing table"

try:
cur.execute( "DROP TABLE IF EXISTS Settings" )
cur.execute("CREATE TABLE IF NOT EXISTS Settings (id INTEGER PRIMARY KEY, key TEXT NOT NULL, value TEXT)")

insert_defaults()

except lite.Error, e:

if conn:
conn.rollback()

print "Error: %s" % e.args[0]
sys.exit(1)

finally:
if conn:
conn.close()

return settings




if __name__ == "__main__":

print initialize()
  • 埃里克

最佳答案

依靠异常来检测表不存在不太可靠,因为可能存在与您要检查的内容无关的其他错误。

确保创建表的最简单方法是在程序启动时执行CREATE TABLE IF NOT EXISTS ...;如果表已经存在,这将被忽略。

要检查某些现有记录,可以使用 SELECT。但是,如果您对 key 列有 UNIQUE 或 PRIMARY KEY 约束,则只需执行 INSERT OR IGNORE INTO Settings...

您不应在 insert_defaults() 中使用单独的连接;如果您的事务提交不正确,这将导致问题。

关于python-2.7 - SQLite3 : Using try: except: to establish db table & default data set - kosher?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20165837/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com