python操作sql文件_Python操作文件模拟SQL语句功能

#_*_coding:utf-8_*_

import os

STAFF_DB = "staff.db"

COLUMN_ORDERS = ['id','name','age','phone','dept','enrolled_date']

def load_db():

staff_data = {

'id': [],

'name': [],

'age': [],

'phone': [],

'dept': [],

'enrolled_date': []

}

f = open(STAFF_DB, 'r', encoding='utf-8')

for line in f:

staff_id, name, age, phone, dept, enrolled_date = line.strip().split(',')

staff_data['id'].append(staff_id)

staff_data['name'].append(name)

staff_data['age'].append(age)

staff_data['phone'].append(phone)

staff_data['dept'].append(dept)

staff_data['enrolled_date'].append(enrolled_date)

f.close()

return staff_data

def save_db():

f = open("%s_tmp" % STAFF_DB, "w", encoding="utf-8")

for index, val in enumerate(STAFF_DATA[COLUMN_ORDERS[0]]):

row = [str(val)]

for col in COLUMN_ORDERS[1:]:

row.append(str(STAFF_DATA[col][index]))

raw_row = ",".join(row)

f.write(raw_row + "\n")

f.close()

os.replace("%s_tmp" % STAFF_DB, STAFF_DB)

def print_log(msg,msg_type='info'):

if msg_type == 'error':

print("\033[31;1m Error:%s\033[0m" %msg)

else:

print("\033[32;1mInfo:%s\033[0m"%msg)

def op_gt(q_name,q_condition):

matched_data = {}

for k in STAFF_DATA:

matched_data[k] = []

for index,i in enumerate(STAFF_DATA[q_name]):

q_condition = float(q_condition)

if float(i) > q_condition:

for k in matched_data:

matched_data[k].append(STAFF_DATA[k][index])

return matched_data

def op_lt(q_name,q_condition):

matched_data = {}

for k in STAFF_DATA:

matched_data[k] = []

for index, i in enumerate(STAFF_DATA[q_name]):

q_condition = float(q_condition)

if float(i) < q_condition:

for k in matched_data:

matched_data[k].append(STAFF_DATA[k][index])

return matched_data

def op_eq(q_name,q_condition):

matched_data = {}

for k in STAFF_DATA:

matched_data[k] = []

for index, i in enumerate(STAFF_DATA[q_name]):

q_condition = float(q_condition)

if float(i) == q_condition:

for k in matched_data:

matched_data[k].append(STAFF_DATA[k][index])

return matched_data

def op_like(q_name,q_condition):

matched_data = {}

for k in STAFF_DATA:

matched_data[k] = []

for index, i in enumerate(STAFF_DATA[q_name]):

if q_condition in i:

for k in matched_data:

matched_data[k].append(STAFF_DATA[k][index])

return matched_data

def syntax_find(query_clause,mached_data):

filter_keys = query_clause.split('find')[1].split('from')[0]

columns = [i.strip() for i in filter_keys.split(',')]

if "*" in columns:

if len(columns) == 1:

columns = COLUMN_ORDERS

else:

print_log("*不能同时与其它字段出现","error")

return False

if len(columns) == 1:

if not columns[0]:

print_log("语法错误,find和from之间必须跟字段名或*", "error")

return False

filter_data = []

for index,val in enumerate(mached_data[columns[0]]):

row = [val,]

for col in columns[1:]:

row.append(mached_data[col][index])

filter_data.append(row)

print(filter_data)

def syntax_add(query_clause):

# add staff.db values Alex Li,25,134435344,IT,2015-10-29

column_vals = [col.strip() for col in query_clause.split("values")[1].split(",")]

if len(column_vals) == len(COLUMN_ORDERS[1:]):

init_staff_id = 0

for i in STAFF_DATA['id']:

if int(i) > init_staff_id:

init_staff_id = int(i)

init_staff_id += 1

STAFF_DATA['id'].append(init_staff_id)

for index, col in enumerate(COLUMN_ORDERS[1:]):

STAFF_DATA[col].append(column_vals[index])

save_db()

print_log("成功添加1条纪录到staff.table表")

else:

print_log("提供的字段数据不足,必须字段%s" % COLUMN_ORDERS[1:], 'error')

def syntax_update(query_clause, matched_data):

count = 0

column_val, value = [col.strip() for col in query_clause.split("set")[1].split('=')]

if column_val in COLUMN_ORDERS:

for index, val in enumerate(matched_data[column_val]):

matched_index = STAFF_DATA[column_val].index(val)

STAFF_DATA[column_val][matched_index] = value

count += 1

print(STAFF_DATA)

print_log("已更新%s条数据"%count,"info")

save_db()

else:

print_log("字段%s不存在" %column_val,'error')

def syntax_delete(query_clause, matched_data):

count = 0

for k in matched_data["id"]:

matched_index = STAFF_DATA["id"].index(k)

for col in COLUMN_ORDERS:

del STAFF_DATA[col][matched_index]

count += 1

print(STAFF_DATA )

print_log("已删除%s条记录"%count,"info")

save_db()

def syntax_where(clause):

operators = {

'>': op_gt,

'

'=': op_eq,

'like': op_like

}

for op_key,op_func in operators.items():

if op_key in clause:

q_name,q_condition = clause.split(op_key)

if q_name.strip() in STAFF_DATA:

matched_data = op_func(q_name.strip(),q_condition.strip())

return matched_data

else:

print_log("字段'%s'不存在" % q_name, 'error')

return False

def syntax_parser(cmd):

syntax_list = {

'find': syntax_find,

'add': syntax_add,

'update': syntax_update,

'delete': syntax_delete

}

if cmd.split()[0] in ['find','update','delete','add'] and 'staff.db' in cmd:

if 'where' in cmd:

query_cmd,where_clause = cmd.split('where')

matched_data = syntax_where(where_clause.strip())

if matched_data:

action_name = cmd.split()[0]

syntax_list[action_name](query_cmd,matched_data)

else:

syntax_list[cmd.split()[0]](cmd )

else:

print_log('''语法错误!\nsample:[find/add/update/delete] name,age from [staff_table] where [id][>/=/like][2]''',

'error')

def main():

while True:

cmd = input("SQL>").strip()

if not cmd: continue

syntax_parser(cmd)

STAFF_DATA = load_db()

main()

def main():

while True:

cmd = input("SQL>").strip()

if not cmd:continue

syntax_parser(cmd)

STAFF_DATA = load_db()

main()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值