首页 » 代码类 » SQL数据库学习

SQL数据库学习

04/29/2019 elliott 代码类

sql学习

今天任务:数据库文件gbk转utf-8码

01. 工具:Navicat

navicat官方教程

Navicat其他非官方教程

02. 操作步骤

网上找了找,确实没有很好的工具进行直接转换。

只能手工操作了,思路如下:

  1. 把数据从数据库导出来

  2. 再把数据导进去就可以了

操作是不是很简单?屁了,慢慢操作吧

03. 导出数据

现在要对数据库进行导出,首先要干的肯定是先备份数据

导出数据有两种操作,一种是用命令行,一种是用python

这里我们选择用python

哦吼,搞不定,放弃。先弄sql命令吧

哦吼,又搞不定,放弃,弄回python脚本,毕竟有现成的成功读取的脚本

用上之前写好的脚本,报错,报错。

算了,自己重新写一份吧python读取sqlite参考链接

淦,改了改总算好了

我们把之前的脚本进行改了改,就可以实现读取功能了:

#!/usr/bin/env python3
# -*- coding:utf-8 -*-

import sqlite3,
#导入模块
vulnDB = 'vuln.db'

conn = sqlite3.connect(vulnDB)
#读取文件
conn.text_factory = lambda x: str(x, 'gbk', 'ignore')
#对读取的sqlite进行gbk处理

res = conn.execute(
            r"""select * from VULNDB""").fetchone()

print(res[3])

# 04. 写入数据

把数据导出来之后就要进行utf-8写入了

现在尝试进行尝试写入数据后,会报错,找了一下资料,找到了解决办法
写入参考链接

最终代码如下:

#!/usr/bin/env python3
# -*- coding:utf-8 -*-

import sqlite3,os
#导入模块
# os.system('CHCP 65001')
vulnDB = 'vuln.db'

conn = sqlite3.connect(vulnDB)
#读取文件
conn.text_factory = lambda x: str(x, 'gbk', 'ignore')
#不太清楚是啥。加进去先
# 这里应该是对数据库进行转码

res = conn.execute(
            r"""select * from VULNDB""").fetchone()
#     # print(type(res.fetchone()))
#     pluginID, vulname, _, vul_desc, vul_solu = res
print(res)

sql = r"""insert into VULNDB1 (Plugin_ID,NAME,Risk,Description,Solution) values(?,?,?,?,?)"""

para = res

conn.execute(sql,para)

conn.commit()

05. 批量读取写入

接下来就是如何把这个数据库逐步读取,然后写入了

刚开始的思路是for进行迭代读取,然后发现有问题

找资料,无果

不说了,问大佬去,得到结果如下:

1.  fetchall出来的结果可迭代的

2.  for i in conn.execute(sql).fetchall():
    conn.execute(update_sql)
    当然,这样写可能导致异常

进行尝试,除了点小错误就是for i in conn.execute(sql).fetchall这里忘了加上括号,导致报错说不可迭代。大佬一语中的的指出了问题,这就是大佬啊(膜拜大佬.jpg)

最后代码如下:

#!/usr/bin/env python3
# -*- coding:utf-8 -*-

import sqlite3,os
#导入模块
# os.system('CHCP 65001')
vulnDB = 'vuln.db'

conn = sqlite3.connect(vulnDB)
#读取文件
conn.text_factory = lambda x: str(x, 'gbk', 'ignore')
#不太清楚是啥。加进去先

sqlread = r"""select * from VULNDB"""

sqlwrite = r"""insert into VULNDB1 (Plugin_ID,NAME,Risk,Description,Solution) values(?,?,?,?,?)"""


for i in conn.execute(sqlread).fetchall():

    print(i)

    para = i

    conn.execute(sqlwrite,para)

conn.commit()       

还有个小知识点就是commit()函数不要写在循环里面,占用资源

06. 总结

总的来说就是不断排坑的过程,但是思路要清晰,然后找找资料,遇到了关卡先思考一下,实在不行就去麻烦大佬 XD (笑)

GitHub代码地址

说点什么

在 "SQL数据库学习"已有1条评论
Loading...
Prev Post Next Post
已跳转到上次阅读的位置,从头阅读?