Python模拟SQL

本文介绍了使用Python模拟SQL操作的方法,包括检查文件存在、读取文件标题、解析WHERE子句、处理UPDATE和SELECT语句的功能。通过定义一系列函数,如`SELECT_TABLE_TITLE`、`WHERE_PARS`、`PARSE`等,实现了对SQL语句中FROM、WHERE、LIMIT等部分的解析,并提供了模拟DELETE、SELECT和UPDATE操作的示例。
摘要由CSDN通过智能技术生成


##仅实现SELECT UPDATE DELETE 功能。表及文件。目录就是当前目录
#encoding=utf-8
import os

def file_exists(filename):
fileex = os.path.exists(filename)
return fileex

def SELECT_TABLE_TITLE(table):
with open(table,“rt”,encoding=“utf-8”) as title:
filetitle = title.readline()
return filetitle

def WHERE_PARS(WHEREDICT):
WHERELIST = []
WHERELIST_ALL = []
for item in WHEREDICT:
if item != “and” and item != “or”:
WHERELIST.append(item)
else:
WHERELIST_ALL.append(WHERELIST)
WHERELIST_ALL.append(item)
WHERELIST = []
WHERELIST_ALL.append(WHERELIST)
return WHERELIST_ALL

def PARS(SQL_L,parsdict):
for item in SQL_L:
if item.lower() in parsdict:
key = item.lower()
# print(key)
continue
else:
# print(key)
parsdict.get(key).append(item)
if parsdict.get(“from”) == [] or not file_exists(parsdict.get(“from”)[0]+".txt"):
print(“SQL语句错误在from处,表不存在”)
return
if parsdict.get(“where”) != []:
WHERELIST_ALL = WHERE_PARS(parsdict.get(“where”))
parsdict[“where”] = WHERELIST_ALL
if list(parsdict.keys())[0] == “update”:
if parsdict.get(“set”) == []:
print(“set设置错误”)
return
else:
SETLIST_ALL = WHERE_PARS(parsdict.get(“set”))
parsdict[“set”] = SETLIST_ALL
return parsdict

def WHERE_ACTION(WHERELIST,linedict):
reslist = []
for item in WHERELIST:
if type(item) is list:
if item[0] in linedict:
if item1 == ‘=’:
if linedict.get(item[0]) == item2:
reslist.append(“True”)
else:
reslist.append(“False”)
elif item1 == ‘like’:
if item2 in linedict.get(item[0]):
reslist.append(“True”)
else:
reslist.append(“False”)
else:
return “error”
else:
return “error”
elif item == “or” or item == “and”:
reslist.append(item)
else:
return “error”
res = eval(" ".join(reslist))
return res

def opentable(filename):
filetable = open(filename+".txt",“rt”,encoding=“utf-8”)
return filetable

def limitfile(file):
limit = 0
for l in file:
limit += 1
return limit

def limitpart(limit):
try:
return int(limit[0])
except:
print(“limit输入有误”)
return

def writetable(filename):
file = open(filename+"_new.txt",“wt”,encoding=“utf-8”)
return file

def write_file(valuedict,writefile):
writelist = list(valuedict.values())
writestr = “”
for w in writelist:
if writelist.index(w) == len(writelist) - 1:
writestr += w + “\n”
else:
writestr += w + " "
writefile.write(writestr)

def delete(SQL,parsdict):
DELETEDICT = PARS(SQL_L=SQL.split(),parsdict=parsdict)
if DELETEDICT == None:
return
filetable = opentable(DELETEDICT.get(“from”)[0])
writefile = writetable(DELETEDICT.get(“from”)[0])
limit = limitfile(filetable)
filetable.seek(0)
title = filetable.readline()
titlelist = title.split()
writefile.write(title)
if DELETEDICT.get(“limit”) != []:
limit = limitpart(DELETEDICT.get(“limit”))
if limit == None:
return
count = 0
while True:
fileline = filetable.readline()
if fileline == “”:
break
if count >= limit:
writefile.write(fileline)
continue
filelinelist = fileline.split()
namedict = dict(list(zip(titlelist, filelinelist)))
if DELETEDICT.get(“where”) == []:
break
else:
RES = WHERE_ACTION(DELETEDICT.get(“where”), namedict)
if RES == True:
count += 1
continue
else:
writefile.write(fileline)
filetable.close()
writefile.close()
os.remove(DELETEDICT.get(“from”)[0]+".txt")
os.rename(DELETEDICT.get(“from”)[0]+"_new.txt",DELETEDICT.get(“from”)[0]+".txt")

def select(SQL,parsdict):
SELECTDICT = PARS(SQL_L=SQL.split(),parsdict=parsdict)
if SELECTDICT == None:
return
filetable = opentable(SELECTDICT.get(“from”)[0])
limit = limitfile(filetable)
filetable.seek(0)
title = filetable.readline().split()
if SELECTDICT.get(“select”)[0] != “*”:
selectname = SELECTDICT.get(“select”)[0].split(",")
for item in selectname:
if item not in title:
print(“查找的列不存在”)
return
else:
selectname = title
if SELECTDICT.get(“limit”) != []:
limit = limitpart(SELECTDICT.get(“limit”))
if limit == None:
return
count = 0
while True:
filetableread = filetable.readline()
linelist = filetableread.split()
namedict = dict(list(zip(title,linelist)))
if filetableread == “”:
break
if SELECTDICT.get(“where”) == []:
if count >= limit:
break
for j in selectname:
print(namedict.get(j), end="" + " “)
print(”")
count += 1
else:
if count >= limit:
break
RES = WHERE_ACTION(SELECTDICT.get(“where”),namedict)
if RES == True:
for j in selectname:
print(namedict.get(j), end="" + " “)
print(”")
count += 1
filetable.close()

def update(SQL,parsdict):
UPDATEDICT = PARS(SQL_L=SQL.split(), parsdict=parsdict)
if UPDATEDICT == None:
return
filetable = opentable(UPDATEDICT.get(“from”)[0])
writefile = writetable(UPDATEDICT.get(“from”)[0])
limit = limitfile(filetable)
filetable.seek(0)
title = filetable.readline()
titlelist = title.split()
writefile.write(title)
if UPDATEDICT.get(“limit”) != []:
limit = limitpart(UPDATEDICT.get(“limit”))
if limit == None:
return
count = 0
while True:
fileline = filetable.readline()
linelist = fileline.split()
namedict = dict(list(zip(titlelist, linelist)))
if fileline == “”:
break
if UPDATEDICT.get(“where”) == []:
for item in UPDATEDICT.get(“set”):
if type(item) is list:
try:
namedict[item[0]] = item2
except:
print(“更新的列不存在”)
writefile.close()
os.remove(writefile)
filetable.close()
write_file(namedict,writefile)
else:
RES = WHERE_ACTION(UPDATEDICT.get(“where”), namedict)

        if RES == True:
            for item in UPDATEDICT.get("set"):
                if type(item) is list:
                    try:
                        namedict[item[0]] = item[2]
                    except:
                        print("更新的列不存在")
                        writefile.close()
                        os.remove(writefile)
                        filetable.close()
                        return
            write_file(namedict,writefile)
        else:
            writefile.write(fileline)
writefile.close()
filetable.close()
os.remove(UPDATEDICT.get("from")[0]+".txt")
os.rename(UPDATEDICT.get("from")[0]+"_new.txt",UPDATEDICT.get("from")[0]+".txt")

def main():
while True:
parsdict = {“select”: {“select”: [],
“from”: [],
“where”: [],
“limit”: []},
“delete”: {“delete”:[],
“from”: [],
“where”: [],
“limit”: []},
“update”:{“update”:[],
“set”:[],
“from”:[],
“where”:[],
“limit”:[]}
}

    SQL = input("请输入SQL语句:").strip()
    if SQL.split()[0].upper() == "SELECT":
        select(SQL,parsdict.get(SQL.split()[0].lower()))
    elif SQL.split()[0].upper() == "DELETE":
        delete(SQL, parsdict.get(SQL.split()[0].lower()))
    elif SQL.split()[0].upper() == "UPDATE":
        update(SQL, parsdict.get(SQL.split()[0].lower()))

main()

欢迎使用Markdown编辑器

你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。

新的改变

我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:

  1. 全新的界面设计 ,将会带来全新的写作体验;
  2. 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;
  3. 增加了 图片拖拽 功能,你可以将本地的图片直接拖拽到编辑区域直接展示;
  4. 全新的 KaTeX数学公式 语法;
  5. 增加了支持甘特图的mermaid语法1 功能;
  6. 增加了 多屏幕编辑 Markdown文章功能;
  7. 增加了 焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置 等功能,功能按钮位于编辑区域与预览区域中间;
  8. 增加了 检查列表 功能。

功能快捷键

撤销:Ctrl/Command + Z
重做:Ctrl/Command + Y
加粗:Ctrl/Command + B
斜体:Ctrl/Command + I
标题:Ctrl/Command + Shift + H
无序列表:Ctrl/Command + Shift + U
有序列表:Ctrl/Command + Shift + O
检查列表:Ctrl/Command + Shift + C
插入代码:Ctrl/Command + Shift + K
插入链接:Ctrl/Command + Shift + L
插入图片:Ctrl/Command + Shift + G
查找:Ctrl/Command + F
替换:Ctrl/Command + G

合理的创建标题,有助于目录的生成

直接输入1次#,并按下space后,将生成1级标题。
输入2次#,并按下space后,将生成2级标题。
以此类推,我们支持6级标题。有助于使用TOC语法后生成一个完美的目录。

如何改变文本的样式

强调文本 强调文本

加粗文本 加粗文本

标记文本

删除文本

引用文本

H2O is是液体。

210 运算结果是 1024.

插入链接与图片

链接: link.

图片: Alt

带尺寸的图片: Alt

居中的图片: Alt

居中并且带尺寸的图片: Alt

当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。

如何插入一段漂亮的代码片

博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.

// An highlighted block
var foo = 'bar';

生成一个适合你的列表

  • 项目
    • 项目
      • 项目
  1. 项目1
  2. 项目2
  3. 项目3
  • 计划任务
  • 完成任务

创建一个表格

一个简单的表格是这么创建的:

项目 Value
电脑 $1600
手机 $12
导管 $1

设定内容居中、居左、居右

使用:---------:居中
使用:----------居左
使用----------:居右

第一列 第二列 第三列
第一列文本居中 第二列文本居右 第三列文本居左

SmartyPants

SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:

TYPE ASCII HTML
Single backticks 'Isn't this fun?' ‘Isn’t this fun?’
Quotes "Isn't this fun?" “Isn’t this fun?”
Dashes -- is en-dash, --- is em-dash – is en-dash, — is em-dash

创建一个自定义列表

Markdown
Text-to- HTML conversion tool
Authors
John
Luke

如何创建一个注脚

一个具有注脚的文本。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值