集群常用脚本

多重执行xcall.sh #!/bin/bash # 遍历所有节点(集群主机列表) for i in cdhmaster01 cdhmaster02 cdhmaster03 cdhnode01 cdhnode02 cdhnode03 do # 打印当前正在操作的主机,方便区分输出 echo "--------- $i ----------" # 通过 ssh 在远程主机执行传入的命令 # "$*" 表示把所有参数当作一个整体传过去 # 例如:./xcall.sh pwd # 实际执行:ssh cdhmaster01 "pwd" ssh $i "$*" done 集群分发xsync.sh #!/bin/bash if [ $# -eq 0 ]; then echo "Usage: $0 [more files_or_dirs]" exit 1 fi hosts=(cdhmaster01 cdhmaster02 cdhmaster03 cdhnode01 cdhnode02 cdhnode03) user=$(whoami) for src in "$@" do if [ ! -e "$src" ]; then echo "Not found: $src" continue fi abs_src=$(readlink -f "$src") name=$(basename "$abs_src") parent=$(dirname "$abs_src") for host in "${hosts[@]}" do echo "===== $host =====" ssh "$host" "mkdir -p '$parent'" if [ -d "$abs_src" ]; then rsync -av "$abs_src" "$user@$host:$parent/" else rsync -av "$abs_src" "$user@$host:$parent/" fi done done

2026年4月2日 · 1 分钟

ORM常用操作

ORM常用操作 Django开发过程中对表(model)的增删改查是最常用的功能之一,本文介绍笔者在使用model 操作过程中遇到的一些操作。 model update常规用法 假如我们的表结构是这样的 class User(models.Model): username = models.CharField(max_length=255, unique=True, verbose_name='用户名') is_active = models.BooleanField(default=False, verbose_name='激活状态') 那么我们修改用户名和状态可以使用如下两种方法: 方法一: User.objects.filter(id=1).update(username='nick',is_active=True) 方法二: _t = User.objects.get(id=1) _t.username='nick' _t.is_active=True _t.save() 方法一适合更新一批数据,类似于mysql语句update user set username='nick' where id = 1 方法二适合更新一条数据,也只能更新一条数据,当只有一条数据更新时推荐使用此方法,另外此方法还有一个好处,我们接着往下看 具有auto_now属性字段的更新 我们通常会给表添加三个默认字段 自增ID,这个django已经默认加了,就像上边的建表语句,虽然只写了username和is_active两个字段,但表建好后也会有一个默认的自增id字段 创建时间,用来标识这条记录的创建时间,具有auto_now_add属性,创建记录时会自动填充当前时间到此字段 修改时间,用来标识这条记录最后一次的修改时间,具有auto_now属性,当记录发生变化时填充当前时间到此字段 就像下边这样的表结构 class User(models.Model): create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间') update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间') username = models.CharField(max_length=255, unique=True, verbose_name='用户名') is_active = models.BooleanField(default=False, verbose_name='激活状态') 当表有字段具有auto_now属性且你希望他能自动更新时,必须使用上边方法二的更新,不然auto_now字段不会更新,也就是: _t = User.objects.get(id=1) _t.username='nick' _t.is_active=True _t.save() json/dict类型数据更新字段 目前主流的web开放方式都讲究前后端分离,分离之后前后端交互的数据格式大都用通用的json型,那么如何用最少的代码方便的更新json格式数据到数据库呢?同样可以使用如下两种方法: 方法一: data = {'username':'nick','is_active':'0'} User.objects.filter(id=1).update(**data) 同样这种方法不能自动更新具有auto_now属性字段的值 通常我们再变量前加一个星号(*)表示这个变量是元组/列表,加两个星号表示这个参数是字典 方法二: ...

2024年3月16日 · 4 分钟

IDEA常用操作

IDEA(IntelliJ IDEA)是业界公认的最好开发工具之一,当然好不好也因人而异,也不要刻意去争谁强谁弱,高手往往不在乎手中的兵器是什么的。个人而言,更高效的工具适合每个开发人员,在编写代码的时候花的时间少,就有更多的时间去设计… 目录 [toc] 一、概述 IDEA(IntelliJ IDEA)是业界公认的最好开发工具之一,当然好不好也因人而异,也不要刻意去争谁强谁弱,高手往往不在乎手中的兵器是什么的。个人而言,更高效的工具适合每个开发人员,在编写代码的时候花的时间少,就有更多的时间去设计代码,当然,使用一个陌生的 IDE,效率肯定是比不上自己熟练的 IDE 的,所以为了节省诸君的学习成本,也为了更快地去接纳和熟练 IDEA,所以周末之余,故作此文。—- 一品江南 准备 所有的电脑软件都有着相同的 UI 框架、菜单结构,对于每一个开发人员来说,基本的文件操作、项目操作、工作空间操作不成问题,不会讲到。 涉及的其他工具(Maven、Git 等)不会详细讲,只会讲到如何操作,想要深入学习,关注其他博文。 二、配置 在安装软件(JDK、Maven、Git、IDEA)搭建好环境后,要对 IDEA 进行一番配置,才能开始开发,每个人都有每个人的配置习惯,可以自己研究自己喜欢的配置,进入 IDEA 的配置 File | Settings(Ctrl+Alt+S)开始配置。 选择菜单或设置步骤使用 “|” 分开,后面操作一样 1. 主题与行为 选择自己喜欢的主题:Appearance & Behavior | Appearance | Theme 配置骚气的背景图片:Appearance & Behavior | Appearance | UI Options | Background Image… 在配置中选择合适的窗口选项:Appearance & Behavior | Appearance | Window Options Animate windows:关闭动画效果 Show memory indicator:显示内存使用情况 Show tool window bars:关闭工具栏显示,按两次Alt键可以显示 Small labels in editor tabs:编辑器显示小标签 配置自己想看到的菜单项和工具栏:Appearance & Behavior | Menus and Toolbars ...

2024年3月2日 · 8 分钟

Git命令行

本地仓库链接远程仓库 git remote add origin <server>git@github.com:yourName/yourRepo.git 创建一个叫做“feature_x”的分支,并切换过去 git checkout -b feature_x 再把新建的分支删掉: git branch -d feature_x 预览差异: git diff <source_branch> <target_branch> 创建一个叫做 1.0.0 的标签: git tag 1.0.0 1b2e1d63ff 想commit自动来提交本地修改,我们可以使用-a标识 git commit -a -m "Changed some files" git commit 命令的-a选项可将所有被修改或者已删除的且已经被git管理的文档提交到仓库中 千万注意,-a不会造成新文件被提交,只能修改。 内建的图形化 git: gitk 彩色的 git 输出: git config color.ui true 使用git gui创建sshkey及查看: 命令行创建ssh key: ssh-keygen -t rsa -C "your_email@youremail.com" 后面的your_email@youremail.com改为你在github上注册的邮箱,之后会要求确认路径和输入密码,我们这使用默认的一路回车就行。成功的话会在~/下生成.ssh文件夹,进去,打开id_rsa.pub,复制里面的key。 验证是否成功,在git bash下输入: ssh -T git@github.com 如果要查看指定文件的修改记录可以使用 git blame 命令,格式如下: git blame <file> ...

2024年2月3日 · 1 分钟

ai栈

任务类型 工具 / 模型 说明 / 能力边界 成本 厂商 文档整理 / 项目重构 / 架构设计 Claude Code(基于 Claude Opus) 高质量理解长上下文,支持跨文件重构和工程分析;生成方案/代码,但需要外部环境执行 pro订阅 claude 写代码 / 单文件实现 OpenAI Codex(GPT-Code 系列) 自动生成可运行代码,适合函数、模块、脚本任务;执行依赖你的环境或接口 plus订阅 openAi 实时代码辅助 / IDE 提示 GitHub Copilot IDE 插件,提供智能补全和片段建议,不提供 API 对话 / 问答 /策略讨论 ChatGPT Plus 快速交互、概念解释、方案讨论 plus订阅 openAi 机械重复 / 简单批处理任务 国内轻量模型 低成本处理大量重复操作或简单格式化任务 miniMax 自动化执行 / 跨渠道智能代理 OpenClaw 可自托管的 AI Agent 框架;整合多模型、消息渠道和技能;能持续管理任务、执行脚本、调用 API 和操作工具;适合自动化工作流和多通道触发,需配置和监管

2024年1月6日 · 1 分钟

数据模型字段及属性详解

数据模型字段及属性详解 在设计数据模型的时候,我们需要根据不同的需求,设计不同的表和不同的字段。不同的字段也可以设置不同的参数。 一个模型(model)就是一个单独的、确定的数据的信息源,包含了数据的字段和操作方法。Django是通过Model操作数据库,不管你数据库的类型是MySql或者Sqlite,Django它自动帮你生成相应数据库类型的SQL语句,所以不需要关注SQL语句和类型,对数据的操作Django帮我们自动完成。只要回写Model就可以了! django根据代码中定义的类来自动生成数据库表。我们写的类表示数据库的表,如果根据这个类创建的对象是数据库表里的一行数据,对象.id 对象.value是每一行里的数据。 基本的原则如下: 每个模型在Django中的存在形式为一个Python类 每个模型都是django.db.models.Model的子类 模型里的每个类代表数据库中的一个表 模型的每个字段(属性)代表数据表的某一列 Django将自动为你生成数据库访问API Django这种操作数据库的方式,我们把它叫做:关系对象映射(Object Relational Mapping,简称ORM)。 我们之前有在管理后台与model模型这文章里简单的接触过。里面的models代码: class Category(models.Model): name = models.CharField('分类',max_length=100) class Tags(models.Model): name = models.CharField('标签',max_length=100) class Article(models.Model): title = models.CharField('标题',max_length=70) intro = models.TextField('摘要', max_length=200, blank=True) category = models.ForeignKey(Category, on_delete=models.CASCADE, verbose_name='分类', default='1') tags = models.ManyToManyField(Tags, blank=True) body = models.TextField() user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name='作者') created_time = models.DateTimeField('发布时间',auto_now_add=True) 字段是模型中最重要的内容之一,也是唯一必须的部分。字段在Python中表现为一个类属性,体现了数据表中的一个列。Django不允许下面两种字段名:1、与Python关键字冲突。2、字段名中不能有两个以上下划线在一起,因为两个下划线是Django的查询语法。也不要使用clean、save、delete等Django内置的模型API名字,防止命名冲突。 每一个字段都是一个类属性,每个类属性表示数据表中的一个列。上面那个models生成数据后,在数据库里是这样的: 表名由Django自动生成,例如我们的Article类会自动生成为blog_Article,默认格式为“应用名称+下划线+小写类名”。如果你不指定主键,Django默认自动创建自增主键id。每个APP应用都有独立属于自己的模型,创建了APP之后,在使用它之前,你需要先在settings文件中的INSTALLED_APPS 处,注册models.py文件所在的app名称。看清楚了,是注册app,不是模型,也不是models.py。关于settings,我们前面也有讲解过,具体可查看文章:全局配置settings详解。例如我们创建了名为blog的应用APP则在settings这样写: INSTALLED_APPS = [ #... 'blog', #我们要添加的应用名 #... ] 当你每次对模型进行增、删、修改时,我们都需要执行python manage.py makemigrations请务必执命令,然后再执行:python manage.py migrate,让操作实际应用到数据库上。 ...

2023年12月24日 · 3 分钟

开源许可证

2023年11月26日 · 0 分钟

分页

分页 Paginator 分页功能是几乎所有的网站上都需要提供的功能,当你要展示的条目比较多时,必须进行分页,不但能减小数据库读取数据压力,也有利于用户浏览。 Django又很贴心的为我们提供了一个Paginator分页工具,但是不幸的是,这个工具功能差了点,不好添加CSS样式,所以前端的展示效果比较丑。如果你能力够,自己编写一个分页器,然后提交给Django官方吧,争取替代掉这个当前的分页器,我看好你哦! 但不管怎么样,当前的Paginator分页器,还是要学一下用一下的。 一、实例展示 分页功能位于django.core.paginator模块。 向Paginator提供包含一些对象的列表,以及你想每一页显示几条,比如每页5条、10条、20条、100条等等,它就会为你提供访问的一系列API方法,示例如下: >>> from django.core.paginator import Paginator >>> objects = ['john', 'paul', 'george', 'ringo'] >>> p = Paginator(objects, 2) # 对objects进行分页,虽然objects只是个字符串列表,但没关系,一样用。每页显示2条。 >>> p.count # 对象个数 4 >>> p.num_pages # 总共几页 2 >>> type(p.page_range) # `<type 'rangeiterator'>` in Python 2. <class 'range_iterator'> >>> p.page_range # 分页范围 range(1, 3) >>> page1 = p.page(1) # 获取第一页 >>> page1 <Page 1 of 2> >>> page1.object_list # 获取第一页的对象 ['john', 'paul'] >>> page2 = p.page(2) >>> page2.object_list ['george', 'ringo'] >>> page2.has_next() # 判断是否有下一页 False >>> page2.has_previous()# 判断是否有上一页 True >>> page2.has_other_pages() # 判断是否有其它页 True >>> page2.next_page_number() # 获取下一页的页码 Traceback (most recent call last): ... EmptyPage: That page contains no results >>> page2.previous_page_number() # 获取上一页的页码 1 >>> page2.start_index() # 从1开始计数的当前页的第一个对象 3 >>> page2.end_index() # 从1开始计数的当前页最后1个对象 4 >>> p.page(0) # 访问不存在的页面 Traceback (most recent call last): ... EmptyPage: That page number is less than 1 >>> p.page(3) # 访问不存在的页面 Traceback (most recent call last): ... EmptyPage: That page contains no results 简单地说,使用Paginator分四步走: ...

2023年9月17日 · 2 分钟

mongo操作

根据日期查询数量 db.getCollection("api_invocation_logs").find({"createdDate":{"$gte":ISODate("2024-01-09T00:00:00Z"),"$lt":ISODate("2024-01-10T00:00:00Z")}}).count() 查看某个字段不为空的数据 db.getCollection('waimao_company_info').find({'numberOfEmployees':{$ne:null}}) 查看某个表所有字段 mr = db.runCommand({ "mapreduce": "waimao_company_info", "map": function() { for (var key in this) { emit(key, null); } }, "reduce": function(key, stuff) { return null; }, "out": "waimao_company_info" + "_keys" }) db[mr.result].distinct("_id") 模糊查询 db.getCollection("rocket").find( {emails:/@/} )

2023年7月23日 · 1 分钟

es操作

ES建表 PUT http://121.46.197.112:9200/cty_test Content-Type: application/json { "settings": { "number_of_shards": 5, "number_of_replicas": 1, "analysis": { "analyzer": { "greek_lowercase_analyzer": { "filter": [ "lowercase" ], "type": "custom", "tokenizer": "standard" } } } }, "mappings": { "cty_test": { "properties": { "dupId": { "type": "text", "fields": { "keyword": { "ignore_above": 256, "type": "keyword" } } }, "id": { "type": "text", "fields": { "keyword": { "ignore_above": 256, "type": "keyword" } } }, "supplierId": { "type": "long" }, "addTime": { "format": "yyyy-MM-dd HH:mm:ss", "type": "date" }, "scCountry": { "type": "keyword" }, "shipName": { "type": "text" }, "manifestQuanityDouble": { "type": "float" }, "importerName": { "analyzer": "greek_lowercase_analyzer", "type": "text", "fields": { "keyword": { "ignore_above": 256, "type": "keyword" } } }, "tradeType": { "type": "integer" }, "arriveDate": { "format": "yyyy-MM-dd", "type": "date" }, "modeOfTransportation": { "type": "keyword" }, "modeoftransPortation": { "type": "text", "fields": { "keyword": { "ignore_above": 256, "type": "keyword" } } }, "weight": { "type": "double" } } } } } ES写入数据 POST http://121.46.197.112:9200/cty_test/cty_test Content-Type: application/json { "dupId": "34324", "id" : "545435", "supplierId" : 43636, "addTime" : "2021-02-05 08:08:08", "scCountry" : "rrr", "shipName" : "uuu", "manifestQuanityDouble" : 55.00, "importerName" : "ccd", "tradeType" : 43, "arriveDate" : "2018-09-03", "weight" : 33.0 } 查询某列不为空 ...

2023年7月9日 · 2 分钟