学习

【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) # 插入数据

最新文章

  1. 【Java】 环境变量如何配置?
  2. RapidJSON 代码剖析(一):混合任意类型的堆栈
  3. 在bootstrap ace样式框架上修改的后台管理型模板(Tab页后台管理模板)
  4. Striiv Myland 攻略
  5. C++STL库之set的用法
  6. 028. asp.net数据绑定控件值DataList控件
  7. js拖拽3D立方体旋转
  8. http://www.cnblogs.com/xia520pi/archive/2012/06/04/2534533.html(重要)
  9. export 命令 设置环境变量
  10. 浅谈C中的指针和数组(五)
  11. 教你一步搭建Flume分布式日志系统
  12. String对象常用的一些方法
  13. Asp.net MVC4高级编程学习笔记-视图学习第一课20171009
  14. swagger2常用注解说明
  15. 复旦大学2016--2017学年第一学期(16级)高等代数I期末考试第七大题解答
  16. CentOS开机报错:sd 0:0:0:0: [sda] Assuming drive cache: write through
  17. 遇到npm报错read ECONNRESET怎么办
  18. markdown学习资料
  19. webstrom 一直反复indexing
  20. Hadoop生态圈-Hive的自定义函数之UDF(User-Defined-Function)

热门文章

  1. MongoDB 复制集监控
  2. Greenplum Segment 的检测机制
  3. js大文件分块上传断点续传demo
  4. mysqli的方法测试小结
  5. 【一起来烧脑】一步Sass学会体系
  6. 印象笔记作为todo(GTD相关)的一个尝试
  7. Function.apply.bind()与Function.apply.bind()
  8. Linux文件的权限的基本介绍
  9. Python在windows平台的多版本配置
  10. Spring boot+Vue全栈开发---Spring Boot文件上传