当前位置:   article > 正文

python中sqlite数据库实时读写切换问题_sqlite某一时刻可能存在对同一个数据库的写操作

sqlite某一时刻可能存在对同一个数据库的写操作

sqlite数据库正常情况下,会在写库时锁住数据库,不允许其他用户占用数据库。但是实际应用过程中,可能需要sqlite数据库满足不同用户同时进行读写。此时可以采用回调函数进行判断解锁。在python中,实现方式如下。

数据写入方式有两种,一种是采用sql语言直接执行sql语句,另一种是采用pandas库,用to_sql的方式写入,这种方式可以一次写入多条数据。下面两个函数表征写入数据,如果数据库空闲,则可写入数据,如果数据库不空闲,报数据库锁定错误,则会执行rollback进行回调。

  1. def conn_exec( connection , cursor , cmd_str):
  2. import pandas as pd
  3. done = False
  4. while not done:
  5. try:
  6. cursor.execute( cmd_str )
  7. done = True
  8. except Exception as err:
  9. connection.rollback()
  10. def conn_tosql( connection , cursor , newdf ,tablename):
  11. import pandas as pd
  12. done = False
  13. while not done:
  14. try:
  15. newdf.to_sql(tablename,connection,index=False,if_exists="append",chunksize=20000)
  16. done = True
  17. except Exception as err:
  18. print("Message:" , err)
  19. connection.rollback()
  20. time.sleep(0.1)

写数据函数执行完,一定需要执行commit命令,真正完成写指令,如conn_comit( connection )函数,这里没有等待过程,程序会一直查询资源是否被占用,如果需要等待,可以加入time.sleep()。

  1. def conn_comit( connection ):
  2. done = False
  3. sk = 0
  4. while not done:
  5. try:
  6. connection.commit()
  7. done = True
  8. except Exception as err:
  9. sk = sk+1
  10. # print("Message:" , sk)
  11. connection.rollback()

函数调用方式如下

  1. heads ='tmstamp timestamp,cID text,score real,height real'
  2. dbfile = './redis_test.db'#新保存库位置
  3. conn = sql.connect(dbfile)
  4. curn=conn.cursor()
  5. sqlstds1 ='CREATE TABLE IF NOT EXISTS tablename'+' ('+heads+')'
  6. conn_exec( conn , curn , sqlstds1)
  7. sqlstds2= 'CREATE INDEX IF NOT EXISTS s_tablename ON tablename'+' (tmstamp,cID);'
  8. conn_exec( conn , curn , sqlstds2)
  9. conn_comit(conn )
  10. conn_tosql( conn , curn , newdf ,tablename) #newdf为需要保存的dataframe值
  11. conn_comit(conn )

补充分界线-------------------------------------------------------------

SQLITE的访问可以有四种方式,主要如下。

1,SQLite使用单线程模式,用一个专门的线程访问数据库。

2,SQLite使用单线程模式,用一个线程队列来访问数据库,队列一次只允许一个线程执行,队列里的线程共用一个数据库连接。

3,SQLite使用多线程模式,每个线程创建自己的数据库连接。

4,SQLite使用串行模式,所有线程共用全局的数据库连接。

上述的roolback()函数的方式,是无法实现数据库的多线程读取数据,采用多线程时,roolback会将执行内容全部回调,所有动作只连接同一个库。如果要实现sqlite多线程,一般采用每个线程建立自己的数据库连接的方式访问。

补充分界线2-------------------------------------------------------------

建于数据库目的只有一个命令在写,一个命令读,且上述用回调函数的方法存储的数据库会有些问题,经验证,直接采用写数据时,连接库,写完关库的方式会更适合,读数据库也一样的道理,如果遇到故障,则等待一定时间再尝试写库。这样的方式打开库会费一些时间,但是整体更可靠。

 

 

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/985278
推荐阅读
相关标签
  

闽ICP备14008679号