我的insert语句执行了两次,但我不确定为什么。 sqlite3

时间:2019-05-09 11:13:32

标签: python sqlite

我有一条插入语句。

   conn = sqlite3.connect('WO1.db')


   with conn:
           cur1 = conn.cursor()
           cur1.execute("insert into workorder (Title, Link, Status) 
    values (?,?,?)", ('iijiji', 'ijjijijj', '22jhhuhij'))

   if conn:
           conn.close()

title和link列具有唯一约束,我遇到以下错误,程序终止。

sqlite3.IntegrityError: UNIQUE constraint failed: 

但是我想要的是将1条新记录插入数据库。

然后我创建了一个新表,其中Title和Link列没有UNIQUE约束。

我再次运行该程序,这次没有收到任何错误,但是,该记录被两次插入到表中,当链接和标题上存在UNIQUE约束时,就会解释该错误。

关于此insert语句为什么执行两次,是否有任何逻辑解释?

注意这只是程序中建立连接,执行查询然后关闭连接的一个位置。除了常规配置外,程序中与该数据库没有其他交互。

除了在此应用程序内,我没有与此数据库打开任何其他会话。

我正在运行程序的python文件中运行此查询。

   app = Flask(__name__)

   app.config.from_object(Config)

   db = SQLAlchemy(app)

   conn = sqlite3.connect('WO1.db')


   with conn:
          cur1 = conn.cursor()
         cur1.execute("insert into workorder (Title, Link, Status) values 
  (?,?,?)", ('en24433', 'www.reddit.com', 'Not Completed'))

 if conn:
         conn.close()


 migrate = Migrate(app, db)


 @app.route('/')
 def index():
     return render_template('index.html')

 if __name__ == '__main__':
     app.run(host='localhost', port=8080, debug= True)

2 个答案:

答案 0 :(得分:0)

您需要重新制作数据库访问代码。

首先,您在with之后使用conn.connect()语句在同一数据库连接两次。

  

当通过多个连接访问数据库,并且其中一个进程修改了数据库时,SQLite数据库将被锁定,直到提交该事务为止。

我认为这是造成您错误的原因

在数据库中插入后,需要提交更改。

  

此方法提交当前事务。如果不调用此方法,则从其他数据库连接中看不到自上次调用commit()以来所做的一切。如果您想知道为什么看不到已写入数据库的数据,请检查您是否没有忘记调用此方法。

请注意, close()不会自动提交:

  

这将关闭数据库连接。请注意,这不会自动调用commit()。如果您只关闭数据库连接而没有先调用commit(),则更改将丢失!

看看sqlite3 API docs

答案 1 :(得分:0)

当我将数据库连接并在语句路由中而不是在路由之上插入语句时,它起作用了。

self.acceptButton.setImage(UIImage(named: image), for: UIControl.State.normal)
self.acceptButton.semanticContentAttribute = .forceRightToLeft
self.acceptButton.imageEdgeInsets = UIEdgeInsets(top: 0, left: 9, bottom: 0, right: 0)