赞
踩
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-------------------------------------------------------------
建于数据库目的只有一个命令在写,一个命令读,且上述用回调函数的方法存储的数据库会有些问题,经验证,直接采用写数据时,连接库,写完关库的方式会更适合,读数据库也一样的道理,如果遇到故障,则等待一定时间再尝试写库。这样的方式打开库会费一些时间,但是整体更可靠。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。