const db = require('sqlite3').verbose()
const path = require("path")
const fs = require("fs")
const {Sequelize} = require('sequelize');
import {localFilePath} from "@/config";
import {creatFolder, fileExistence} from "@/utils/file";
import writers from "@/db/writers/tables/writers";
export default class DbUtils {
// 所有要存放或者要读取的本地文件根路径
public localFilePath: string = localFilePath()
protected dbPathTem: string = '' // 临时的数据库文件路径
public readonly defaultFolder: string = 'dbFile'
constructor() {
this.setLocalFilePath()
}
public setLocalFilePath = (path: string = localFilePath()): void => {
this.localFilePath = path
}
/**
* @description 保存数据库文件
* @param {string} dbNameIsFullPath dbName是否完整路径,如果不是会自动拼接
* @param {string} dbName 数据库文件名称
* @param {string} folderName 存放的文件夹名称(默认dbs),如果没有则自动创建
* @return {string} 如果数据库已经存在,则返回路径,否则返回空字符串
*/
public createDbFile(dbNameIsFullPath: boolean = true, dbName: string = this.dbPathTem, folderName?: string): Promise<string> {
return new Promise((resolve, reject) => {
if (!this.judgeDbExists(dbNameIsFullPath, dbName, folderName)) {
const dbFile = new db.Database(this.dbPathTem, (err: any) => {
if (err) {
console.error('创建数据库失败=> ', err)
resolve('')
} else {
console.log(`创建数据库${dbName}成功`)
resolve(this.dbPathTem)
}
})
} else {
console.log(`数据库${dbName}已经存在`)
resolve(this.dbPathTem)
}
})
}
/**
* @description db文件路径
* @param {string} dbName
* @param {string} folderName 存放于哪个文件夹下,如果没有会自动创建
*/
public dbPath(dbName: string, folderName: string = this.defaultFolder): string {
return path.join(creatFolder(folderName), dbName + ".db")
}
/**
* @description 判断db文件是否存在, 并设置临时路径
* @param {boolean} dbNameIsFullPath dbName是否完整路径,如果不是会自动拼接
* @param {string} dbName
* @param {string} folderName 存放于哪个文件夹下,如果没有会自动创建
*/
public judgeDbExists(dbNameIsFullPath: boolean = true, dbName: string, folderName: string = this.defaultFolder): boolean {
this.dbPathTem = dbNameIsFullPath ? dbName : this.dbPath(dbName, folderName)
return fileExistence(true, this.dbPathTem)
}
/**
* @description db文件路径
* @param {boolean} dbNameIsFullPath dbName是否完整路径,如果不是会自动拼接
* @param {string} dbName 文件名
* @param {string} folderName 存放于哪个文件夹下,如果没有会自动创建
*/
public connectDb(dbNameIsFullPath: boolean = true, dbName: string = this.dbPathTem, folderName: string = this.defaultFolder): Promise<any> {
return new Promise((resolve, reject) => {
if (!this.judgeDbExists(dbNameIsFullPath, dbName, folderName)) {
console.error(`数据库${dbName}不存在,请先创建`)
resolve(false)
} else {
const dbInstance: any = new db.Database(this.dbPathTem, (err: any) => {
console.log(2)
if (err) {
console.error('连接数据库失败=> ', err)
resolve(false)
} else {
console.log('连接数据库成功', dbInstance)
resolve(dbInstance)
}
})
}
})
}
/**
* @description 自动创建并连接异步函数
* @param {boolean} dbNameIsFullPath dbName是否完整路径,如果不是会自动拼接
* @param {string} dbName 文件名
* @param {string} folderName 存放于哪个文件夹下,如果没有会自动创建
*/
public async creatAndConnectDb(dbNameIsFullPath: boolean, dbName: string, folderName: string = this.defaultFolder) {
if (!this.judgeDbExists(dbNameIsFullPath, dbName, folderName)) {
const res = await this.createDbFile()
}
return await this.connectDb()
}
/**
* @description 自动创建并连接异步函数-使用Sequelize工具
* @param {boolean} dbNameIsFullPath dbName是否完整路径,如果不是会自动拼接
* @param {string} dbName 文件名
* @param {string} folderName 存放于哪个文件夹下,如果没有会自动创建
*/
public async sequelizeOrm(dbNameIsFullPath: boolean, dbName: string, folderName: string = this.defaultFolder): Promise<boolean> {
if (!this.judgeDbExists(dbNameIsFullPath, dbName, folderName)) {
const res = await this.createDbFile()
if (!res) return false
}
try {
// 如果需要可以创建连接池 https://sequelize.org/docs/v6/other-topics/connection-pool/
const dataBase = await new Sequelize({
dialect: 'sqlite',
storage: this.dbPathTem
})
await dataBase.authenticate();
console.log('Connection has been established successfully. || 成功连接数据库!');
return dataBase
} catch (error) {
console.error('Unable to connect to the database:', error);
return false
}
}
// 创建连接多个表
public async createConnectTables(tables: any[], db:any){
return await Promise.all(tables.map(table => new Promise((resolve, reject) => resolve(db.define(table.name, table.data)))))
}
}
// export default new dbUtils()
export const localFilePath = (): string => __dirname.substring(0, __dirname.indexOf('resources') + 9)
import { localFilePath } from "@/config";
const fs = require("fs")
const path = require("path")
/**
* @description 创建文件夹
* @param {string} folderName 文件夹名
* @param {string} folderBeforePath 文件夹存放于哪个路径下
*/
export function creatFolder(folderName: string, folderBeforePath: string = localFilePath()) {
try {
const folderPath = path.join(folderBeforePath, folderName)
if(!fs.existsSync(path.join(localFilePath(), folderName))){
console.error(folderName + '文件夹不存在,正在创建...路径为 => \n', folderPath)
fs.mkdirSync(folderPath)
return folderPath
} else {
console.log(folderName + '文件夹已经存在,路径为=>', folderPath)
return folderPath
}
} catch (e) {
console.error('创建文件夹出错=>', e)
return false
}
}
// 创建文件
export function creatFile() {
}
/**
* @description 判断文件是否存在
* @param {string} fileNameIsFullPath fileName是否完整路径
* @param {string} fileName 文件名
* @param {string} folderName 存放于哪个文件夹或路径下
* @return { string } 如果文件存在,则返回路径,否则返回空字符串
*/
export function fileExistence(fileNameIsFullPath: boolean, fileName: string, folderName: string = ''): boolean {
try {
return fs.existsSync(fileNameIsFullPath ? fileName : path.join(localFilePath()), folderName, fileName)
} catch (e) {
console.error('检测文件是否存在出错=>', e)
return false
}
}
import DbUtils from "@/db/DbUtils";
const { Sequelize, Model, DataTypes } = require("sequelize");
import writers from "./tables/writers"
export default class Writer extends DbUtils{
private tableWriters: any
private tableTest: any
public dataBase: any
public constructor() {
super();
}
// 创建数据库、连接数据库、创建表
public async creatTable() {
const dataBase = await this.sequelizeOrm(false, 'writer')
// this.tableWriters = await dataBase.define(writers.name, writers.data); // 本来想这么写,可是总报错,就放弃了
const res = await this.createConnectTables([ writers], dataBase) // 其实这个封装没必要,封装了也可以,同时连接多个数据库
this.tableWriters = res[0]
// 将模型与数据库同步 参数文档 https://sequelize.org/api/v7/interfaces/syncoptions
await (async () => {
// @ts-ignore
await dataBase.sync({ force: false }); //当为true时,先删除表后再创建, 默认false
})();
this.dataBase = dataBase
return true
}
// 下面这些就可以直接调用了
public async insertWriter (content: string) {
const res = await this.tableWriters.create({ content: encodeURIComponent(content) });
res.save()
return res
}
public async getWriters () {
const res = await this.tableWriters.findAll();
return res
}
}
const { DataTypes } = require("sequelize");
// 如果后期需要新增字段需要手动定义migration(数据库迁移)。直接添加是不可行的
export default {
name: 'writers', // 表名
data: {
id: {
type: DataTypes.INTEGER, // INTEGER类型
primaryKey: true, // 主键
autoIncrement: true, // 自增长
},
content: {
type: DataTypes.TEXT,
allowNull : false
// defaultValue: '0', // 默认值
},
desc: {
type: DataTypes.TEXT, //
allowNull: true, // 不允许为空
defaultValue: '没有简介', // 默认值
},
// createTime: { // 自带
// type: DataTypes.STRING,
// allowNull : false
// },
// updateTime: { // 自带
// type: DataTypes.STRING,
// allowNull : false
// },
createArea: {
type: DataTypes.STRING,
allowNull : false,
defaultValue: '北京市', // 默认值
},
}
}
文章浏览阅读965次,点赞18次,收藏21次。现在我们有了 2021 年和 2023 年的 NDVI 数据帧,我们需要从 2021 年的值中减去 2023 年的值以捕获 NDVI 的差异。该数据集包括像素级别的植被值,我们将编写一个自定义函数来根据红色和绿色波段的表面反射率计算 NDVI。在我的上一篇文章中,我演示了如何将单个多边形分割/镶嵌为一组大小均匀的六边形。现在我们有了植被损失数据,让我们使用 Kepler.gl 可视化每个六边形的植被损失。将地图保存为 HTML 文件,在浏览器中打开 HTML 以获得更好的视图。现在我们将调用该函数并使用、
文章浏览阅读3.3k次,点赞6次,收藏5次。正态分布,又称高斯分布或钟形曲线,是统计学中最为重要和常用的分布之一。_echarts正态分布图
文章浏览阅读217次。首先要在Mainfest.xml中加入所需要的权限:[html] view plain copyprint?uses-permission android:name="android.permission.SEND_SMS"/> uses-permission android:name="android.permission.READ_SMS"/> _android bundle.get("pdus");
文章浏览阅读2.6k次。0、说明最近在学习 Data Assimilation Research Testbed (DART) 相关内容,其软件是在 Unix/Linux 操作系统下编译和运行的 ,由于我的电脑是 Windows 10 的,DART 推荐可以使用 Windows Subsystem For Linux (WSL) 来创建一个 Windows 下的 Linux 子系统。以下的内容主要介绍如何安装 WSL2,以及 WSL2 的联网。1、如何在 Windows 10 下安装WSL具体的安装流程可以在 microso_wsl2 联网
文章浏览阅读1k次。DB_LINK 介绍在本机数据库orcl上创建了一个prod_link的publicdblink(使用远程主机的scott用户连接),则用sqlplus连接到本机数据库,执行select * from scott.emp@prod_link即可以将远程数据库上的scott用户下的emp表中的数据获取到。也可以在本地建一个同义词来指向scott.emp@prod_link,这样取值就方便多了..._添加 database link重复的数据库链接命
文章浏览阅读3.1k次。ylbtech-云-腾讯云-实时音视频:实时音视频(TRTC)支持跨终端、全平台之间互通,从零开始快速搭建实时音视频通信平台1.返回顶部 1、腾讯实时音视频(Tencent Real-Time Communication,TRTC)拥有QQ十几年来在音视频技术上的积累,致力于帮助企业快速搭建低成本、高品质音视频通讯能力的完整解决方案。..._腾讯实时音视频 分享链接
文章浏览阅读534次,点赞10次,收藏8次。编写一个完整的日历表需要处理许多细节,包括公历和农历之间的转换、节气、闰年等。运行程序后,会输出指定年份的日历表。注意,这个程序只是一个简单的示例,还有很多可以改进和扩展的地方,例如添加节气、节日等。_农历库c语言
文章浏览阅读1w次,点赞28次,收藏27次。FL Studio21.1.1.3750中文破解版是最优秀、最繁荣的数字音频工作站 (DAW) 之一,日新月异。它是一款录音机和编辑器,可让您不惜一切代价制作精美的音乐作品并保存精彩的活动画廊。为方便用户,FL Studio 21提供三种不同的版本——Fruity 版、Producer 版和签名版。所有这些版本都是独一无二的,同样具有竞争力。用户可以根据自己的需要选择其中任何一种。FL Studio21.1.1.3750中文版可以说是一站式综合音乐制作单位,可以让您录制、作曲、混音和编辑音乐。_fl studio 21 注册机
文章浏览阅读1.3k次。冯诺依曼计算机工作原理冯 诺依曼计算机工作原理的核心是 和 程序控制世界上不同型号的计算机,就其工作原理而言,一般都是认为冯 诺依曼提出了什么原理冯 诺依曼原理中,计算机硬件系统由那五大部分组成的 急急急急急急急急急急急急急急急急急急急急急急冯诺依曼结构计算机工作原理的核心冯诺依曼结构和现代计算机结构模型 转载重学计算机组成原理 一 冯 诺依曼体系结构从冯.诺依曼的存储程序工作原理及计算机的组成来..._简述冯诺依曼计算机结构及工作原理
文章浏览阅读559次。这次在随机乱下的基础上加上了一些简单的处理,如进营、炸棋、吃子等功能,在和敌方棋子产生碰撞之后会获取敌方棋子大小的一些信息,目前采用的是事件驱动模型,当下完一步棋界面返回结果后会判断是否触发了相关事件,有事件发生则处理相关事件,没有事件发生则仍然是随机下棋。1.事件驱动模型首先定义一个各种事件的枚举变量,目前的事件有工兵吃子,摸暗棋,进营,明确吃子,炸棋。定义如下:enum MoveE..._军棋引擎
文章浏览阅读85次。1, 模板观念与函数模板简单模板: template< typename T > T Function( T a, T b) {… }类模板: template struct Object{……….}; 函数模板 template< class T> inline T Function( T a, T b){……} 不可以使用不同型别的..._geekband 讲义
文章浏览阅读158次。"^\d+$" //非负整数(正整数 + 0)"^[0-9]*[1-9][0-9]*$" //正整数"^((-\d+)|(0+))$" //非正整数(负整数 + 0)"^-[0-9]*[1-9][0-9]*$" //负整数"^-?\d+$" //整数"^\d+(\.\d+)?$" //非负浮点数(正浮点数 + 0)"^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0..._vb.net 正则表达式 取html中的herf