flask_sqlalchemy

目录
  • 1. model.py
  • 实操作

1. model.py

# pip install flask-sqlalchemy
from flask_sqlalchemy import SQLAlchemy
from flask import Flask

app = Flask(__name__)

# app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:123456@127.0.0.1:3306/test'

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + "/home/lmp/test.db"

app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['SECRET_KEY'] = 'xxx'
db = SQLAlchemy(app)


# 学生表
class Student(db.Model):
    __tablename__ = "student"
    id = db.Column(db.Integer, primary_key=True)  # id号(独一无二的)
    name = db.Column(db.String(64), nullable=False)  # 学生姓名
    gender = db.Column(db.Enum("男", "女"), nullable=False)  # 学生性别
    phone = db.Column(db.String(11), unique=True, nullable=False)  # 学生手机号
    courses = db.relationship("Course", secondary="student_course", backref="students")  # 关系关联
    grades = db.relationship("Grade", backref="student")  # 成绩关系关联


# 学生-课程中间表
class StudentCourse(db.Model):
    __tablename__ = "student_course"
    id = db.Column(db.Integer, primary_key=True)  # id号(独一无二的)
    students_id = db.Column(db.Integer, db.ForeignKey("student.id"))  # 学生的id
    courses_id = db.Column(db.Integer, db.ForeignKey("course.id"))  # 课程的id


# 课程表
class Course(db.Model):
    __tablename__ = "course"
    id = db.Column(db.Integer, primary_key=True)  # id号(独一无二的)
    name = db.Column(db.String(32), unique=True)  # 课程名字
    teacher_id = db.Column(db.Integer, db.ForeignKey("teacher.id"))  # 所属老师的id
    grades = db.relationship("Grade", backref="course")  # 成绩关系关联


# 教师表
class Teacher(db.Model):
    __tablename__ = "teacher"
    id = db.Column(db.Integer, primary_key=True)  # id号(独一无二的)
    name = db.Column(db.String(32), unique=True)  # 姓名
    phone = db.Column(db.String(11), unique=True, nullable=False)  # 手机号
    gender = db.Column(db.Enum("男", "女"), nullable=False)  # 性别
    course = db.relationship("Course", backref="teacher")  # 所教课程


# 成绩表
class Grade(db.Model):
    __tablename__ = "grade"
    id = db.Column(db.Integer, primary_key=True)  # id号(独一无二的)
    my_grade = db.Column(db.String(32), unique=True)  # 分数
    course_id = db.Column(db.Integer, db.ForeignKey("course.id"))  # 所属课程
    students_id = db.Column(db.Integer, db.ForeignKey("student.id"))  # 所属学生


if __name__ == "__main__":
    db.create_all()
    # db.drop_all()

实操作

from learn_sql import db, Student, Grade, Teacher, Course

# 增

# s = Student(name="张三", gender="男", phone="12345678900")

# s1 = Student(name="kk", gender="女")
# s2 = Student(name="张蛋", gender="女")
# s3 = Student(name="李四", gender="男")
# s4 = Student(name="李鬼", gender="男", phone="12345678900")

# 语句 第一种
# db.session.add(s)
# db.session.commit()
#
# db.session.add_all([s1, s2, s3, s4])
# db.session.commit()

# 查

# get(id) 查 单一个
# stu = Student.query.get(1)
# print(stu)
# print(stu.name)
# print(stu.gender)
# print(stu.phone)

# all() 查全部
# stu = Student.query.all()
# print(stu)
# for i in stu:
#     print(i.name, i.gender, i.phone)

# filter() 条件查询
# stu = Student.query.filter(Student.gender == "女")
# print(stu)
# for i in stu:
#     print(i.name, i.id,i.gender)


# filter_by() 比较类似SQL的查询  first() 查询到的第一个
# stu = Student.query.filter_by(name="张三").first()
# print(stu)
# print(stu.name, stu.id, stu.gender)


# stu = Student.query.filter_by(name="张三").filter(Student.id <= 2)
# print(stu)
# for i in stu:
#     print(i.name, i.id)

# 改
# 第一种
# stu = Student.query.filter(Student.id == 1).update({"name": "张毅1"})# 返回动了多少条数据
# db.session.commit()
# print(stu)


# stu = Student.query.filter(Student.gender == "男").update({"gender": "女"})  # 返回动了多少条数据
# print(stu)
# db.session.commit()

# 第二种
# 匹配一个出来,修改
# stu = Student.query.get(1)
# print(stu.name,stu.gender)
# stu.gender = "男"
# db.session.add(stu)
# db.session.commit()
# print(stu.name,stu.gender)

# 匹配第一个修改
# stu = Student.query.filter(Student.gender == "男").first()
# print(stu.name,stu.gender)
# stu.gender = "女"
# db.session.add(stu)
# db.session.commit()
# print(stu.name,stu.gender)

# 修改全部
# stu = Student.query.filter(Student.gender == "女").all()
# for i in stu:
#     i.gender = "男"
#     db.session.add(i)
# db.session.commit()


# 删
#
# stu = Student.query.filter(Student.id >= 5).delete()  # 返回动了多少条数据
# print(stu)
# db.session.commit()

# stu = Student.query.all()
# for i in stu:
#     print(i.gender,i.name)

# print("--------------------------")

# grade1 = Grade(grade=100, student_id=1)
# grade2 = Grade(grade=95, student_id=1)
#
# db.session.add(grade1)
# db.session.add(grade2)
# db.session.commit()

# stu = Student.query.all()
# for i in stu:
#     print(i.gender, i.name)

# grade = Grade.query.filter(Grade.student_id == 1).all()
# for i in grade:
#     print(i.student_id, i.student, i.student.name)

# 通过 一 访问 多
stu = Student.query.get(1)
for i in stu.grades:
    print(stu.name,i.grade)


# 通过 多 访问 一

# grade = Grade.query.filter(Grade.grade == "100").all()
# for i in grade:
#     print(i.student.name,i.student.gender)


# 多对多
# student0 = Student(name="李玲", gender="女", phone="12345678900")
# student1 = Student(name="李依", gender="女", phone="12345678901")
# student2 = Student(name="李贰", gender="男", phone="12345678902")
# student3 = Student(name="李叁", gender="男", phone="12345678903")
# student4 = Student(name="李斯", gender="男", phone="12345678904")
# student5 = Student(name="李舞", gender="女", phone="12345678905")
# student6 = Student(name="李榴", gender="男", phone="12345678906")
# student7 = Student(name="李淇", gender="女", phone="12345678907")
# student8 = Student(name="李巴", gender="男", phone="12345678908")
# student9 = Student(name="李玖", gender="男", phone="12345678909")
#
# teacher0 = Teacher(name="老数", gender="男", phone="12345678910")
# teacher1 = Teacher(name="老语", gender="女", phone="12345678911")
# teacher2 = Teacher(name="老英", gender="女", phone="12345678912")
# teacher3 = Teacher(name="老物", gender="男", phone="12345678913")
# teacher4 = Teacher(name="老化", gender="男", phone="12345678914")
# teacher5 = Teacher(name="老生", gender="男", phone="12345678915")
#
# course0 = Course(name="数学")
# course1 = Course(name="语文")
# course2 = Course(name="英语")
# course3 = Course(name="物理")
# course4 = Course(name="化学")
# course5 = Course(name="生物")
#
# db.session.add_all(
#     [student0, student1, student2, student3, student4, student5, student6, student7, student8, student9, teacher0,
#      teacher1, teacher2, teacher3, teacher4, teacher5, course0, course1, course2, course3, course4, course5])
# db.session.commit()

# for i in range(1, 7):
#     c = Course.query.filter(Course.id == i).update({"teacher_id": i})
# db.session.commit()


# 查询课程表
# cs = Course.query.filter(Course.id >= 2).all()
# print(cs)
# 查询学生
# stu = Student.query.filter(Student.id >= 2).all()
# for s in stu:
#     s.courses = cs
#     db.session.add(s)
#     db.session.commit()

# 学生查询课程
# stu = Student.query.get(1)
# for s in stu.courses:
#     print(s.name)
# print(stu.courses)
#
# print("===================")

# 课程查询学生
# c = Course.query.get(2)
# for s in c.students:
#     print(s.name)

[Haima的博客] http://www.cnblogs.com/haima/
本文转载于网络 如有侵权请联系删除

相关文章

  • Java入门必背100条

    大家好,又见面了,我是你们的朋友全栈君。Java必背100条1、编写:编写的Java代码保存在以“.java”结尾的源文件中。2、编译:使用javac.exe命令编译java源文件,生成字节码文件。格式:javac源文件名.java3、运行:使用java.exe命令解释运行字节码文件。格式:java类名4、在一个java源文件中可以声明多个class,但是只能最多有一个类声明为public,而且被声明为public的类的类名必须与源文件名相同。5、java关键字中所有字母都为小写6、Java中的名称命名规范:包名:多单词组成时所有字母都小写:xxxyyyzzz类名、接口名:多单词组成时,所有单词的首字母大写:XxxYyyZzz变量名、方法名:多单词组成时,第一个单词首字母小写,第二个单词开始每个单词首字母大写:xxxYyyZzz常量名:所有字母都大写。多单词时每个单词用下划线连接:XXX_YYY_ZZZ7、字符串是属于一个类,属于引用数据类型 8、在类体内,在方法体外声明的变量称为成员变量。9、在方法体内部声明的变量称为局部变量。局部变量除形参外,需显式初始化才能使用。(形参也是局部

  • 数据可视化:可以下钻的着色地图

    前期写文章推荐过在PowerBI中使用SVG着色地图,该种类型的地图可以方便的显示数据标签: 还可以切片切换区域: 但是,该方案有个重大功能缺失:不能下钻。那么,有没有办法既能显示想要的数据标签,又可以省市区下钻层级,最好还能依据企业需求自定义大区,如果着色格式能多种多样就更好了?例如下面的例子: 可以按照公司规则,将全国市场划分为南北大区:着色方式可以是各种颜色或者图案: 可以大区下钻到省(示例为虚拟的北区): 省继续下钻到市: 当然,也可以返回上一层级。甚至由着色效果切换为点渲染效果只需要一键变更:很遗憾,PowerBI目前无法实现这样的效果。永洪BI可以,它和PowerBI一样-桌面版完全免费,有兴趣的读者可以按照以下步骤尝试使用永洪BI进行地图可视化。 1.数据准备 将带有地理位置的Excel文件导入永洪BI,导入方式如下图所示,新建数据链接。导入后的结果如下: 切换到元数据视图,可以看到系统自动将数据分为维度和度量,这与其他BI产品的含义类似。为实现后期的地图下钻功能,此处需要新建层次,将大区-省-市设置为同一个层级,注意先后顺序。 以上完成后,点击新建报告,开始可视化操作。

  • 纪念那些在2019年逝去的技术

    大数据文摘出品 来源:medium编译:LYLM每年都能看到有些受欢迎的应用程序,值得关注的初创公司和一些新奇想法还未真正起步就逐渐淡出我们的视线。medium提前获悉了部分会在2019年关闭的产品,比如说谷歌+,Inbox和拥有海量免费储存空间的Flickr等,除此之外,还有不少其他公司和产品在2019年与我们正式告别了。和文摘菌一起回顾一下那些在2019年逝去的技术吧。一月谷歌ChromecastAudio音频接收器:于2015年9月首次发布,可通过3.5毫米的音频插口插入扬声器或音响系统,以实现无线传输。但随着越来越多的无线扬声器的推出,对于ChromecastAudio的需求减少。在2019年1月份,谷歌方面宣布它将停产。ChromecastAudioNortonCore:NortonCore是一款具有时尚感的路由器,自带安全控制和家长控制功能,能为家中的从电脑到智能冰箱等所有设备提供保护。但好看的外表也无法挽救这个小工具。赛门铁克在2019年早些时候证实,NortonCore的硬件将停止生产。《西部世界》手游:2018年,贝塞斯达软件公司起诉华纳兄弟互动娱乐和加拿大游戏开发商

  • 英伟达联手Arm CPU打造AI超算,百万兆级性能,主攻气候变化和核武建模

    雷刚发自凹非寺 量子位报道|公众号QbitAIAI超算怎么搞?老黄祭出联谊招。在国际超算大会上,英伟达宣布正式支持ArmCPU,为高性能计算行业开辟了一条全新途径,以构建具有极高能效水平的百万兆级AI超级计算机。具体方面,英伟达将在年内为Arm态系统提供全堆栈的AI和HPC软件。该堆栈为600多个HPC应用程序和所有AI框架提供加速。其中包括了所有英伟达CUDA-XAI和HPC库、GPU加速的AI框架和软件开发工具,如支持OpenACC的PGI编译器和性能分析器。 堆栈优化完成后,英伟达将为所有主要CPU架构提供加速,包括x86、POWER和ARM。英伟达创始人黄仁勋说,英伟达CUDA加速和ARM的高效能CPU架构结合,一定可以推动超算的大幅提升,目标是百万兆级。据称英伟达和ARMCPU联手的超算,将率先在预测气候变化和核武器系统建模等领域展开试水。 英伟达官方还专门提到了节能,ArmCPU的开放性之外,节能也是这次联手的题中之义。在最新发布的Green500排行榜,全球最节能的25款超级计算机中,有22款都得益于英伟达的支持。需要说明的是,这也不是英伟达和Arm首次联手。之前英伟达用

  • 【Android】RxJava的使用(三)转换——map、flatMap

    前两篇AndroidRxJava的使用(一)基本用法、AndroidRxJava的使用(二)Action介绍了RxJava的基本用法,对Rxjava还不了解的请先看以上两篇。这篇为大家讲解RxJava中map和flatMap的使用。参考:给Android开发者的RxJava详解 (本文部分内容引用自该博客) 回顾前两篇为大家介绍了使用RxJava打印多个字符串的方法Observable.just("Hellow","Wrold").subscribe(newAction1<String>(){ @Override publicvoidcall(Strings){ Log.i(TAG,s); } });复制这样的例子基本没有实际用处,只是为大家演示如何使用Rxjava。今天就抛开这个例子。map在使用map之前要先说道一个接口:Func1,Func1和上一篇提到的Action1相似。Func1和Action的区别在于,Func1包装的是有返回值的方法。 接下来就是map的用法,看代码更直观点; 例:得到多个Student对象中的name

  • 观点 | Hadoop没有消亡,它是大数据的未来

    选自KDnuggets作者:VamsiK.Chemitiganti机器之心编译参与:微胖、李泽南、吴攀有人认为Hadoop正在失败,但硅谷数据管理公司Hortonworks的总经理VamsiK.Chemitiganti并不这么看,为了反驳此前一篇文章《为什么Hadoop正在消亡?(WhyHadoopisFailing)》的观点,他在自己的博客上写了一篇论述自己看法的文章,他认为达尔文式的开源生态系统正在确保Hadoop成为稳固和成熟的技术平台。机器之心对这篇反驳文章进行了编译介绍,但本文内容并不代表机器之心的观点。「女士,那么刚出生的孩子能干什么?」——迈克尔·法拉第,在18世纪被问及新发明的电有什么用的时候。 为什么Hadoop正在发展壮大过去两年来,我一直致力于大数据方面的研究,并在这段时间里经历了令人感到震撼的变革,因为我一直在全球各地为银行业的领导者们提供咨询服务。这也是为什么当近期KDnuggets出现了一篇挑衅性质的《为什么Hadoop正在消亡》时,我必须站出来反对了。在那篇文章中,作者的讨论具有建设性,但问题在于其讨论基于一些毫无根据的假设。在深入研究之前,我们要考虑其中

  • 图解Focal Loss以及Tensorflow实现(二分类、多分类)

    论文链接:Focallossfordenseobjectdetection 总体上讲,FocalLoss是一个缓解分类问题中类别不平衡、难易样本不均衡的损失函数。首先看一下论文中的这张图: 解释: 横轴是groundtruth类别对应的概率(经过sigmoid/softmax处理过的logits),纵轴是对应的loss值; 蓝色的线(gamma=0),就是原始交叉熵损失函数,可以明显看出groundtruth的概率越大,loss越小,符合常识; 除了蓝色的线,其他几个都是FocalLoss的线,其实原始交叉熵损失函数是FocalLoss的特殊版本(gamma=0) 其他几个FocalLoss线都在蓝色下边,可以看出FocalLoss的作用就是【衰减】; 从图中可以看出,groundtruth的概率越大(即容易分类的简单样本),衰减越厉害,也就是大大降低了简单样本的loss; 从图中可以看出,groundtruth的概率越小(即不易分类的困难样本),也是有衰减的,但是衰减的程度比较小; 下边是我自己模拟的一组数据,一组固定的logits=[0+epsilon,0.1,0.2,...

  • 【CF932E】Team Work

    题面 https://www.luogu.org/problem/CF932E 题解 先交换求和号、把$S2(i,j)$中$j>i$的部分去掉、再对角线替换、最后配个对$i$来说的“常数”,就把式子变成一个组合数了。 #include<iostream> #include<cstdio> usingnamespacestd; #definemod1000000007 #defineinv2500000004 #defineriregisterint #defineN5050 intpow(inta,intb){ints=1;while(b){if(b&1)s=1ll*s*a%mod;a=1ll*a*a%mod;b>>=1;}returns;} intn,k,s2[N][N],ans; intmain(){ scanf("%d%d",&n,&k);s2[0][0]=1; for(rii=1;i<=k;++i) for(rij=1;j<=k;++j) s2[i][j]=(s2[i-1][j-1]+1ll*s2[

  • js求时间差

    vardate1=newDate(); //开始时间 alert("aa"); vardate2=newDate();  //结束时间 vardate3=date2.getTime()-date1.getTime() //时间差的毫秒数   //计算出相差天数 vardays=Math.floor(date3/(24*3600*1000))     //计算出小时数 varleave1=date3%(24*3600*1000)  //计算天数后剩余的毫秒数 varhours=Math.floor(leave1/(3600*1000)) //计算相差分钟数 varleave2=leave1%(3600*1000)    //计算小时数后剩余的毫秒数 varminutes=Math.floor(leave2/(60*1000))   //计算相差秒数 varleave3=leave2%(60*1000)   //计算分钟数

  • Service Unavailable的原因以及解决办法

    ServiceUnavailable中文翻译是:服务不可用。 原因分析: 1、注册的ISAPI筛选器。如果注册的ISAPI的DLL程序有BUG,则一旦出问题,就可能导致程序池停止服务。 2、ASP.net程序。也是因为程序有BUG导致。 3、系统资源不足,如IIS连接、CPU、内存、带宽等;程序池停止时,也会提示这个。 4、网站程序臃肿,消耗资源太严重;或者网站正在被攻击,导致系统资源消耗过大。 5、其他很多原因。 解决办法: 当出现ServiceUnavailable时,您首先需要检查该站点对应的程序池是否停止。 1、如果程序池没有停止,绝大多数情况下是资源不足,增加可用资源即可。 2、如果程序池停止状态,启用即可恢复。 3、开发程序自动监视,有问题则做相应处理。 如果频繁出现ServiceUnavailable,表明其中一个和您共用资源的站点出了问题,比如消耗资源太多被系统限制,一般就需要联系您的服务商解决了。

  • 「にちじょう記録」MTIDnWtMOA

    MistakesThatIDon'tWanttoMakeOnceAgain. //Caution// 差分/前缀和后注意询问区间端点有变化…… 不要考虑了右边界就不考虑左边界 //Caution// 只减不加莫队如果维护了数据结构,换块的时候要将前缀块(处理过的)的影响消除.一个高庙的写法是开个stack记录修改,然后将换块的左指针挪动的stack清了.at-rrads 只加不减应该也有类似的问题.

  • asp.net 后台任务作业框架收集

    收集几个可以用于asp.net的后台任务工具库并简单介绍。 hangfire.io  支持单次任务(Fire-and-forget),延时任务(Delayed),重复任务(Recurring ),支持CPU/IO密集型任务,长、短任务。不依赖windows服务或者是任务。 任务信息可以存储到 Redis,SQLServer,SQLAzure和MSMQ中。因为有控制台可以监控任务执行情况,所以支持分布式部署。 任务最小粒度为分钟。 在asp.netweb中使用.net版本需.net45以上,且为owin应用程序。 最新版支持asp.netcore。   FluentScheduler 就像名字一样,使用fluent风格来配置任务。最小任务时间粒度是秒。支持 单次任务(ToRunOnceIn)、重复任务(AddEvery)和延迟任务(DelayFor)。 支持asp.net和asp.netcore。最低.net版本是.net40。    Quartz.net 这是个作业调度框架,是从jav

  • Go Mysql使用

    GoMysql @(Golang) 说明 1.安装 gogetgithub.com/go-sql-driver/mysql gogetgithub.com/jmoiron/sqlx 复制 2.连接 database,err:=sqlx.Open("mysql","root:XXXX@tcp(127.0.0.1:3306)/test") //database,err:=sqlx.Open("数据库类型","用户名:密码@tcp(地址:端口)/数据库名") 复制 3.查询 packagemain import( "fmt" _"github.com/go-sql-driver/mysql" "github.com/jmoiron/sqlx" ) //createtableperson(user_idintnotnullprimarykeyauto_increment,usernamevarchar(100)notnulldefault''); typePersonstruct{ UserIdint`db:"user_id"` Usernamestring`db:"userna

  • git技巧

    工作区->gitadd->暂存区->gitcommit->版本库->gitpush->远程仓库 版本库HEAD表示当前版本,上一个版本HEAD^,上上一个版本HEAD^^....... 配置本机gitgitconfig--globaluser.name"abcd"gitconfig--globaluser.emailabcd@efgh.com git连接自己的github第一步:创建SSH_key:ssh-keygen-trsa-C"aaadega@gmail.com",创建成功后.ssh文件下的id_rsa是私钥,id_rsa.pub是公钥第二步:登陆GitHub,打开“Accountsettings”,“SSHKeys”页面第三步:添加SSHkey,用公钥 一切从版本库同步到远程的git都有uname和pword操作push其他都是从本地直接切换操作 一定要从自己的账号下clone仓库,这样你才能推送修改。先fork再clone gitinit初始化此文件夹为版本库gitaddreadme.txt将文件从工作区添加到暂存区gitcheckout-

  • 【转】《从入门到精通云服务器》第四讲—DDOS攻击

      上周咱们深入分析了云服务器的配置问题,好了,现在手上有了云服务器之后,我们又不得不提它:DDOS攻击。这是所有运维者的心头痛,也是任何公司听闻后都将心惊胆战的强大对手。下面我们将用浅显易懂的方式讲述什么叫DDOS攻击。   DDOS攻击形象比喻   某饭店可以容纳100人同时就餐,某日有个商家恶意竞争,雇佣了200人来这个饭店坐着不吃不喝,导致饭店满满当当无法正常营业。(DDOS攻击成功)   老板当即大怒,派人把不吃不喝影响正常营业的人全都轰了出去,且不再让他们进来捣乱,饭店恢复了正常营业。(添加规则和黑名单进行DDOS防御,防御成功)   主动攻击的商家心存不满,这次请了五千人逐批次来捣乱,导致该饭店再次无法正常营业。(增加DDOS流量,改变攻击方式)   饭店把那些捣乱的人轰出去后,另一批接踵而来。此时老板将饭店营业规模扩大,该饭店可同时容纳1万人就餐,5000人同时来捣乱饭店营业也不会受到影响。(增加硬防与其抗衡)   DDOS是DistributedDenialofService的缩写,翻译成中文是“分布式拒绝服务“攻击,网络中的DDOS攻击与防御与上面例子所述差不多,D

  • 解析PHP中常见的mongodb查询操作_PHP教程

    //栏位字串为$querys=array("name"=>"shian");//数值等于多少$querys=array("number"=>7);//数值大于多少$querys=array("number"=>array('$gt'=>5));//数值大于等于多少$querys=array("number"=>array('$gte'=>2));//数值小于多少$querys=array("number"=>array('$lt'=>5));//数值小于等于多少$querys=array("number"=>array('$lte'=>2));//数值介于多少$querys=array("number"=>array('$gt'=>1,'$lt'=>9));//数值不等于某值$querys=array("number"=>array('$ne'=>9));//使用js下查询条件$js="function(){returnthis.number==2&&this.name=='shi

  • MySql数据库备份与还原

    备份(mysqldump) 实现功能:    1、备份指定的数据库    2、删除指定天数前的备份文件,默认设定了1天 脚本示例(mysql_bak.sh) #数据库备份根目录 BACKUP_DIR="/usr/local/mysqlbackups/tsmbak/" #指定mysql所在主机的主机名 DB_HOSTNAME='hostname' #指定mysql登录用户名 DB_USERNAME='root' #指定mysql登录密码 DB_PASSWORD='xxxx' #指定备份的数据库名 DB_NAME="xxxx" #定义当前日期为变量 CURRENT_DATE=$(date+"%Y%m%d$H") #定义删除N天前的文件变量 DEL_DAYS_BEFORE_FILES=1 #指定mysqldump所在目录 MYSQLDUMP_DIR="/usr/bin" #按日期创建目录(数据库备份目录) BASH_PATH=${BACKUP_DIR}/${CURRENT_DATE} echo"--------

  • C# winform程序实现开机自启动,并且识别是开机启动还是双击启动

    开机启动程序,在很多场合都会用到,尤其是那种在后台运行的程序。 效果图:     以上两幅图都用到了命令行启动程序,为了模拟开机启动或者其他程序调用此程序。 第一幅图:程序启动可以根据不同参数,执行不同的操作。如果是双击启动,就自动运行逻辑代码,如果是带特定参数启动,就自动运行逻辑代码。 第二幅图:winform程序设置开机启动,模拟双击启动和开机启动的不同效果。   开机启动并自动运行方法:其实思路很简单,就是将程序添加到注册表中,这设置值的时候,加一个参数就可以了。然后程序在入口函数处判断启动参数,如果有启动参数,就走自动运行逻辑代码,如果没有,就只是程序启动,并不运行逻辑代码。   【Main参数】    在C/C++中,我们很明确的知道main(intargc,char*argv[]/*,char *envp[]*/)函数有两(三)个参数,第三个参数一般用得少,我是还没用到过。所以常见的都是用两个参数。第一个是参数个数,非负数。第二个是表示从执行环境传递给程序的各个实参。也就是说,我们要用程序入口参数,只需要判断ar

  • 在甲方做三年安全的碎碎念

    在朋友圈看到华住的一位同行做了再华住工作2年的总结,自己刚好转到甲方工作满3年了,也顺便总结/分享一下自己的感受吧。     三年,说长也长,说短也短,之前在A三年,从公司的民房十几人,到走的时候,几百人,创业不易,一路说不出的艰辛,也算见证了一家创业公司的发展,并且听说现在发展的也不错,可能快上市了。 后来跳到了一家甲方,简称B公司,到现在,又干了三年,但是和在A公司不一样,身在甲方,不仅仅是研究安全漏洞了,更注重的是保护企业的安全,推动安全建设。 刚才的时候,公司500多人,到现在快到1800人。到公司的上市,也是人生比较难得的职业成长机会。有的时候我常常说,我可能就是比别人幸运很多。     今天也算给自己的三年做个总结吧;   最初不太适应,新的环境,新的人群,好像没有创业公司大家那么热情,大家都在忙着自己手工的工作,了解公司的架构,了解公司的安全业务情况。但是和刚工作的时候一样,充满热情,激情无限。 记得刚来的时候,就是对目前现有的环境进行渗透测试,对于在乙方,并且“身经百战”的人来说,是比较熟悉的工作,最后也顺利拿到服务器权限,并且推进修复。后来开始转

  • 2017.11.28 第二次作业小组第一次例会

    本次例会主要事项: (1)、确定自动化测试工具,QTP。 (2)、完成小组成员间的任务分配。 赵同学和沈同学负责软件的安装和调试,和测试脚本的设计。张同学和梁同学负责系统需求分析和设计测试用例。毛同学负责博客以及测试过程文档的撰写。小红同学完成视频的录制和缺陷报告文档的撰写。 (3)、确定本次实践作业每日任务。 暂时遇到的困难: QTP的安装调试。

  • linux部署skywalking

    常见的监控工具对比 SkyWalking:中国人吴晟(华为)开源的一款分布式追踪,分析,告警的工具,现在是Apache旗下开源项目,对云原生支持,目前增长势头强劲,社区活跃,中文文档没有语言障碍。 Zipkin:Twitter公司开源的一个分布式追踪工具,被SpringCloudSleuth集成,使用广泛而稳定,需要在应用程序中埋点,对代码侵入性强 Pinpoint:一个韩国团队开源的产品,探针收集的数据粒度非常细,但性能损耗大,因其出现的时间较长,完成度很高。 Cat:美团大众点评开源的一款分布式链路追踪工具。需要在应用程序中埋点,对代码侵入性强。 1.安装es 安装java环境 yum-yinstalljava-1.8* 下载包 wgethttps://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.15.2-x86_64.rpm 解压 rpm-ivhelasticsearch-7.15.2-x86_64.rpm 查看 rpm-qcelasticsearch /etc/elasticsearc

相关推荐

推荐阅读