python中sqlite数据库实时读写切换问题

3 篇文章 0 订阅

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

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

def conn_exec( connection , cursor , cmd_str):
    import pandas as pd
    done        = False
    while not done:
        try:
            cursor.execute( cmd_str )
            done = True
        except Exception as err:
            connection.rollback()
def conn_tosql( connection , cursor , newdf ,tablename):
    import pandas as pd
    done        = False
    while not done:
        try:
            newdf.to_sql(tablename,connection,index=False,if_exists="append",chunksize=20000) 
            done = True
        except Exception as err:
            print("Message:" , err)
            connection.rollback()
            time.sleep(0.1)   

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


def conn_comit( connection ):
    done        = False
    sk = 0
    while not done:
        try:
            connection.commit()
            done = True
        except Exception as err:
            sk = sk+1
#             print("Message:" , sk)
            connection.rollback()

函数调用方式如下

heads ='tmstamp timestamp,cID text,score real,height real'

dbfile = './redis_test.db'#新保存库位置
conn = sql.connect(dbfile)
curn=conn.cursor()  

sqlstds1 ='CREATE TABLE IF NOT EXISTS tablename'+' ('+heads+')'    
conn_exec( conn , curn , sqlstds1)
sqlstds2= 'CREATE INDEX IF NOT EXISTS s_tablename ON tablename'+' (tmstamp,cID);' 
conn_exec( conn , curn , sqlstds2)
conn_comit(conn )

conn_tosql( conn , curn , newdf ,tablename) #newdf为需要保存的dataframe值
conn_comit(conn )

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

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

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

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

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

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

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

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

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

 

 

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值