学习

【Python】Flask系列-数据库笔记

实践

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from sqlalchemy import create_engine
from sqlalchemy.schema import Column
from sqlalchemy.types import Integer, DateTime, LargeBinary, Text, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
import datetime ,time import json
import binascii
Base = declarative_base() class SqlPlugin(object):
class Reports(Base):
"""
ORM映射子域名的嵌入类
简单的列表
"""
__tablename__ = 'result_siblings' # 建立表列 id = Column('id', Integer, primary_key=True) # 自动增长ID
host = Column('host', String(256)) # 主机,目标域名表对应的IP做主要关联
title = Column('title', String(256)) # 网站标题
ip = Column('ip', String(256)) # IP
domain = Column('domain', String(256)) # 子域名
port = Column('port', String(256)) # 当前HTTP网络端口
country = Column('country', String(256)) # 国家代码
province = Column('province', String(256)) # 省份
city = Column('city', String(256)) # 城市
country_name = Column('country_name', String(256)) # 国家名字
header = Column('header', String(256)) # 网络回显
server = Column('server', String(256)) # 容器版本
protocol = Column('protocol', String(256)) # 协议
banner = Column('banner', String(256)) # 版本信息
cert = Column('cert', String(5000)) # 证书信息
isp = Column('isp', String(256)) # 运营商
as_number = Column('as_number', String(256)) # Autonomous System (AS) Numbers
as_organization = Column('as_organization', String(256)) # as_organization
data_source = Column('data_source', String(256)) # 数据来源
app_name = Column('app_name', String(256)) # 应用指纹
create_time = Column('create_time', DateTime(), default='now') # 数据创建时间
update_time = Column('update_time', DateTime(), default='now') # 数据更新时间 # 通过构造函数写入内容
def __init__(self, insert_value):
dt = datetime.datetime.now()
dt_now = dt.strftime('%Y-%m-%d %H:%M:%S') # 当前日期和当前时间
self.update_time = dt_now # 数据更新时间
self.create_time = dt_now # 数据创建时间 self.host = insert_value['host'] # 主机,目标域名表对应的IP做主要关联
self.title = insert_value['title'] # 网站标题
self.ip = insert_value['ip'] # IP
self.domain = insert_value['domain'] # 子域名
self.port = insert_value['port'] # 当前HTTP网络端口
self.country = insert_value['country'] # 国家代码
self.province = insert_value['province'] # 省份
self.city = insert_value['city'] # 城市
self.country_name = insert_value['country_name'] # 国家名字
self.header = insert_value['header'] # 网络回显
self.server = insert_value['server'] # 容器版本
self.protocol = insert_value['protocol'] # 协议
self.banner = insert_value['banner'] # 版本信息
self.cert = insert_value['cert'] # 证书信息
self.isp = insert_value['isp'] # 运营商
self.as_number = insert_value['as_number'] # Autonomous System (AS) Numbers
self.as_organization = insert_value['as_organization'] # as_organization
self.data_source = insert_value['data_source'] # 数据来源
self.app_name = insert_value['app_name'] # 应用指纹 def __init__(self, **kwargs):
"""
constructor receive a **kwargs as the **kwargs in the sqlalchemy
create_engine() method (see sqlalchemy docs)
You must add to this **kwargs an 'url' key with the url to your
database
This constructor will :
- create all the necessary obj to discuss with the DB
- create all the mapping(ORM) todo : suport the : sqlalchemy.engine_from_config :param **kwargs:
:raises: ValueError if no url is given,
all exception sqlalchemy can throw
ie sqlite in memory url='sqlite://' echo=True
ie sqlite file on hd url='sqlite:////tmp/reportdb.sql' echo=True
ie mysql url='mysql+mysqldb://scott:tiger@localhost/foo'
"""
# SqlPlugin.__init__(self)
self.engine = None
self.url = None
self.Session = sessionmaker() if 'url' not in kwargs:
raise ValueError
self.url = kwargs['url']
del kwargs['url'] # 建立库
try:
self.engine = create_engine(self.url, **kwargs) # 链接数据库
Base.metadata.create_all(bind=self.engine, checkfirst=True) # 按照子类的结构在数据库中生成对应的数据表信息
self.Session.configure(bind=self.engine) # 将创建的数据库连接关联到这个session
except:
raise def insert(self, insert_value):
"""
在后端插入子域名的数据
:returns: 后端对象的标识以供将来使用或者None
""" # 写入当前扫描的信息
sess = self.Session()
report = SqlPlugin.Reports(insert_value) # 把字典参数写入到类的构造函数里
sess.add(report) # 添加要添加的参数
sess.commit() # 提交数据
reportid = report.id # 返回插入到数据库里的索引ID
sess.close() return reportid if reportid else None def get_filter_domain(self, domain=None):
if domain is None:
raise ValueError
sess = self.Session()
# 获取指定地址的所有端口
out_report = (
sess.query(SqlPlugin.Reports).filter_by(domain=domain).first())
sess.close()
# 查询成功返回值
if out_report == None:
return False
else:
return True def update(self, update_value):
sess = self.Session()
update_info = (
sess.query(SqlPlugin.Reports).filter_by(domain=update_value['domain']).first()) # 查询指定IP,指定端口 # 更新数据日期
dt = datetime.datetime.now()
dt_now = dt.strftime('%Y-%m-%d %H:%M:%S') # 当前日期和当前时间
update_info.update_time = dt_now
update_info.title = update_value['title'] # 修改标题
update_info.ip = update_value['ip'] # 修改IP
update_info.domain = update_value['domain'] # 修改domain
update_info.port = update_value['port'] # 修改port
update_info.country = update_value['country'] # 修改country
update_info.province = update_value['province'] # 修改province
update_info.city = update_value['city'] # 修改city
update_info.country_name = update_value['country_name'] # 修改country_name
update_info.header = update_value['header'] # 修改header
update_info.server = update_value['server'] # 修改server
update_info.protocol = update_value['protocol'] # 修改protocol
update_info.banner = update_value['banner'] # 修改banner
update_info.cert = update_value['cert'] # 修改cert
update_info.isp = update_value['isp'] # 修改isp
update_info.as_number = update_value['as_number'] # 修改as_number
update_info.as_organization = update_value['as_organization'] # 修改as_organization
update_info.data_source = update_value['data_source'] # 修改data_source
update_info.app_name = update_value['app_name'] # 修改app_name sess.commit()
sess.close() def get(self, report_id=None):
"""
获取指定ID的数据 :param id: str :returns: 子域名单条数据
"""
if report_id is None:
raise ValueError
sess = self.Session()
our_report = (
sess.query(SqlPlugin.Reports).filter_by(id=report_id).first())
sess.close()
return our_report.decode() if our_report else None def getall(self):
"""
:param filter:实现了一个过滤器功能 :returns: 元组集合(id,子域名数据)
"""
sess = self.Session()
nmapreportList = [] for report in (
sess.query(SqlPlugin.Reports).
order_by(SqlPlugin.Reports.inserted)):
nmapreportList.append((report.id, report.decode()))
sess.close() return nmapreportList def delete(self, report_id=None):
"""
从后端删除报表 :param id: 字符串 :returns: 删除的行数
"""
if report_id is None:
raise ValueError
nb_line = 0
sess = self.Session()
nb_line = sess.query(SqlPlugin.Reports). \
filter_by(id=report_id).delete()
sess.commit()
sess.close()
return nb_line if __name__ == "__main__":
sql_opreration = SqlPlugin(url='mysql+pymysql://root:root@192.168.221.143:3306/17bdw_data?charset=utf8', echo=False,
encoding='utf-8', pool_timeout=3600)
# 数据
insert_value = {"host": 1,
"title": 2,
"ip": 3,
"domain": 4,
"port": 5,
"country": 6,
"province": 7,
"city":8,
"country_name":9,
"header":10,
"server":11,
"protocol":12,
"banner":13,
"cert":14,
"isp":15,
"as_number":16,
"as_organization":17,
"data_source":18,
"app_name":200
} # 判断是否存在这个值来决定是插入还是更新
if sql_opreration.get_filter_domain(domain=123):
sql_opreration.update(insert_value) # 更新数据
else:
sql_opreration.insert(insert_value) # 插入数据

python扫描器-sqlalchemy入库操作的更多相关文章

  1. 基于Python的SQLAlchemy的操作

    安装 在Python使用SQLAlchemy的首要前提是安装相应的模块,当然作为python的优势,可以到python安装目录下的scripts下,同时按住shift+加上鼠标左键,从而在菜单中打开命 ...

  2. python之SQLAlchemy ORM 上

    前言: SQLAlchmey是暑假学的,当时学完后也没及时写博客整理下.这篇博客主要介绍下SQLAlchemy及基本操作,写完后有空做个堡垒机小项目.下篇博客整理写篇关于Web框架和django基础~ ...

  3. python之SQLAlchemy ORM

    前言: 这篇博客主要介绍下SQLAlchemy及基本操作,写完后有空做个堡垒机小项目.有兴趣可看下python之数据库(mysql)操作.下篇博客整理写篇关于Web框架和django基础~~ 一.OR ...

  4. 第二百八十九节,MySQL数据库-ORM之sqlalchemy模块操作数据库

    MySQL数据库-ORM之sqlalchemy模块操作数据库 sqlalchemy第三方模块 sqlalchemysqlalchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API ...

  5. python使用sqlalchemy连接pymysql数据库

    python使用sqlalchemy连接mysql数据库 字数833 阅读461 评论0 喜欢1 sqlalchemy是python当中比较出名的orm程序. 什么是orm? orm英文全称objec ...

  6. sqlalchemy 的操作

    使用PyMySQL的前提: 1. 先建好表 2. 自己动手需要手动去写多条SQL语句 改进: 类 ------>  表 实例化 -> 数据 这种思想叫:ORM(Object Relatio ...

  7. Python开发【第三篇】:Python基本之文件操作

    Python基本之文本操作 一.初识文本的基本操作 在python中打开文件有两种方式,即:open(...) 和  file(...) ,本质上前者在内部会调用后者来进行文件操作,推荐使用 open ...

  8. 【Python数据分析】Python3操作Excel(二) 一些问题的解决与优化

    继上一篇[Python数据分析]Python3操作Excel-以豆瓣图书Top250为例 对豆瓣图书Top250进行爬取以后,鉴于还有一些问题没有解决,所以进行了进一步的交流讨论,这期间得到了一只尼玛 ...

  9. [python]用Python进行SQLite数据库操作

    用Python进行SQLite数据库操作 1.导入Python SQLITE数据库模块 Python2.5之后,内置了SQLite3,成为了内置模块,这给我们省了安装的功夫,只需导入即可~  ]: u ...

随机推荐

  1. Restful API 指南

    作为软件开发人员,我们大多数人在日常生活中使用或构建 REST api.API 是系统之间的默认通信方式.亚马逊是如何有效地使用 api 进行通信的最佳例子. 在这篇文章中,我将讨论如何更好地设计 R ...

  2. bzoj 2969: 矩形粉刷 概率期望+快速幂

    还是老套路:期望图上的格子数=$\sum$ 每个格子被涂上的期望=$\sum$1-格子不被图上的概率 这样的话就相对好算了. 那么,对于 $(i,j)$ 来说,讨论一下上,下,左,右即可. 然后发现四 ...

  3. am335x system upgrade rootfs for dhcpcd cross compile(十三)

    dhcpcd移植 [目的] 移植dhcpcd的目是在AM335X开发板上使用dhcp功能,获取WAN口设备的IP,并且可以通过参数指定其matric,matric值越小,其优先级越高.如设备可以以太网 ...

  4. man、whatis、apropos命令

    man命令类似于Linux的帮助文档. 1.man1提供给普通用户的可执行命令说明: 输入man 1 ls 后,结果如下: 结果分析: (1)NAME:命令的名称: (2)SYNOPSIS:参数的使用 ...

  5. Linux学习建议[转]

    端正学习态度学linux不会为了当黑客或者骇客,如果你为了当黑客或骇客而学习Linux,那么你离进监狱不远了,只是时间早晚而已.很多小白都知道“黑客攻击工具”很多来源与Linux平台上的,我也曾指导过 ...

  6. service 与 log日志

    service 初始化执行环境变量PATH和TERM PATH=/sbin:/usr/sbin:/bin:/usr/bin TERM,为显示外设的值,一般为xterm 执行/etc/init.d/目录 ...

  7. [golang]写了一个可以用 go 来写脚本的工具:gosl

    转自:https://golangtc.com/t/53cca103320b52060a000030 写了一个可以用 go 来写脚本的工具:gosl 代码和使用说明可以看这里: http://gith ...

  8. 两个int类型的数据相加,有可能会出现超出int的表示范围。

    两个int类型的数据相加,有可能会出现超出int的表示范围. /* 移位运算符: <<(左移) 规律:一个操作数进行左移运算的时候,结果就是等于操作数乘以2的n次方,n就是左移 的位数. ...

  9. 容易被忽视的python装饰器的特性

    今天发现了装饰器的另一种用法,下面就先上代码: data_list = [] def data_item(func): data_list.append(func) return func @data ...

  10. 2018-2019 20165226 Exp 8 Web基础

    2018-2019 20165226 Exp 8 Web基础 目录 一.实验内容说明及基础问题回答 二.实验过程 1.Web前端:HTML 2.Web前端j:avascipt 3.Web后端:MySQ ...