学习

【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. Apache Solr Velocity模板远程代码执行

    更多内容,欢迎关注微信公众号:信Yang安全,期待与您相遇. 这里用的docker环境 很简单的 在这里不再介绍 本地搭建好环境然后访问8983端口 网页如下: 查下节点名称 同样名字可以访问http ...

  2. ElasticSearch 初识ES

    版权声明:本文为博主原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/u013047584/article/det ...

  3. python 使用 jt400.jar

    jt400helper.py #coding=utf-8 import jpype import os class JT400Helper(object): def __init__(self, se ...

  4. am335x using brctl iptables dhcpcd make multi wan & multi lan network(十五)

    构建多LAN口多WAN口动态网络 [目的] 在AM335X定制动态网络功能,如下所示,在系统当中有两个以太网口,有4G模块,有wifi芯片8188eu支持AP+STA功能. [实验环境] 1.  Ub ...

  5. npm 安装全局包 不是内部或外部命令的问题

    场景: npm已经安装成功  ,通过npm install -g 安装的 全局包 提示不是内部或外部命令 第一步: npm list -g --depth=0:查看npm全局包的路径,和有哪些安装包 ...

  6. Java 输入流和字符串互相转换

    import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.InputStream; impo ...

  7. [提权]sudo提权复现(CVE-2019-14287)

    2019年10月14日, sudo 官方在发布了 CVE-2019-14287 的漏洞预警. 0x00 简介 sudo 是所有 unix操作系统(BSD, MacOS, GNU/Linux) 基本集成 ...

  8. SpringMVC从Session域中获取值

    SpringMVC从Session域中获取值 SpringMVC环境自行搭建 第一步:前端页面 第二步.后台代码 第三步.响应视图 第四步.在当前处理器所在的类设置@SessionAttributes ...

  9. java代码拼写sql

    java后台    String zffwdm=map.get("zffwmc")==null?"":map.get("zffwmc"); ...

  10. vim 文本替换讲解

    在VIM中进行文本替换: 1. 替换当前行中的内容: :s/from/to/ (s即substitude) :s/from/to/ : 将当前行中的第一个from,替换成to.如果当前行含有多个 fr ...