数据库操作——mongoDB、MySQL、KBase、Neo4j

目录

一、mongoDB

1、MongoDB安装

在Ubuntu的命令行中输入:sudo apt-get install mongodb
(一般等待安装,一会便安装成功)
在这里插入图片描述
检查是否安装成功:root@cqf-THTF-Chaoqiang-Server:/# mongo
在这里插入图片描述

注意:安装时出错,提示“有未满足的依赖关系”,本次解决方法是“重装系统”。

2、启动、重启、关闭MongoDB

1、启动mongodb:

Linux下启动mongodb:
nohup /usr/bin/mongod -f /etc/mongod.conf &
nohup命令 mongo应用 –f mongo配置文件
在这里插入图片描述
service mongod start
(默认设置MongoDB是随Ubuntu启动自动启动的)

2、重启

sudo service mongodb restart

3、关闭

use admin
db.shutdownServer({force : true})
service mongodb stop

3、导入文件:mongoimport | 导出文件:mongoexport | 备份数据库:mongodump | 恢复数据库:mongorestore

1、导入

导入、导出可以是.csv等格式文件。
【其与mongo.exe是同级的,因此不能进入Mongo后执行该命令】
-h 主机ip+端口号
-d 数据库名
-c 集合名
-f 字段名 (mongo中自动会有一个_id字段,相当于主键,因此不可以_id自己命名字段)
-type 文件类型
-file 文件所在目录
在这里插入图片描述

2、导出

在这里插入图片描述

3、备份

备份、恢复基于.bson文件
在这里插入图片描述

示例:备份mongodb数据库到与当前mongodump命令同一位置backup目录下:在这里插入图片描述

4、恢复

在这里插入图片描述

示例:-d指定要恢复为的数据库,可以将备份的数据库恢复到与原来不同名的数据库中,这里为mongodb2,–drop表示在恢复前删除集合(若存在)。否则,数据就会与现有集合数据合并,可能会覆盖一些文档。 在这里插入图片描述

4、命令行操作

(1)显示所有的数据库:> show dbs;
(2)切换数据库:> use db_name; (当db_name不存在时则会直接创建一个新的)
(3)显示当前数据库中所有的集合:> show collections;> show tables;
(4)查询操作:db.collection_name.find({条件})

  • 查询返回指定字段(jielun):db.paper_2005.find({}, {‘jielun’:1})
  • 模糊匹配(like)查询:
    ① 类似于SQL中的like %str%:db.paper_2005.find({'bjqw': /研究展望/}, {'bjqw':1})
    ②类似于SQL中的like str%:db.paper_2005.find({'bjqw': /^<研究展望>/}, {'bjqw':1})
    ③使用正则:db.paper_2005.find({'title': {'$regex': '一分钟学会'}}, {'bjqw':1})
  • 查询嵌套字段:db.paper_2005.find({'jielun_fet.is_jielunduan': 1})
  • 逻辑比较查询条件:db.paper_2005.find({'user': {'$ne': 'fish'}}).count()
逻辑运算符:
"$lt"    "<"
"$lte"   "<="
"$gt"    ">"
"$gte"   ">="
"$ne"   "!="
  • 判断字段是否存在:db.paper_2005.find({'user': {'$exists': true}})
  • 查询条件为两个字段的比较:db.paper_2005.find({'$where': 'this.Predict_tag_bayes != this.Predict_tag_SVM'})
  • 查询一个字段有几种值:db.collection.distinct(filed_name), 返回结果是list
    如:db.paper_2005.distinct('filename')
    在Python中:coll.find().distinct(filed_name)
  • 查询存在/不存在某个集合的数据($in / $nin):
db.paper_2005.find({
   'nian': {
   '$in': ['2010', '2011', '2012', '2013', '2014', '2015']})

(5)向指定数据库(my_mongo)的集合(my_collection)中插入数据:(之前需要切换到my_mongo):> db.my_collection.insert({'name':'cqf', 'age':12})
(6)更新操作:db.collection_name.update({键值对条件},{$set:{键值对}},upsert, multi)
(条件可以省略,只写{})
 upsert : 如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
 multi : mongodb默认是false,只更新找到的第一条记录,如果为true,就把按条件查出来多条记录全部更新。
特别的,
①更新字段名:> db.getCollection('my_collection').update({}, {'$rename':{'age':'age_new'}}, false, true);
②删除字段名:> db.my_collection.update({}, {'$unset':{'age':''}}, false, true);
(7)删除操作(删除所有数据,{}中可以加入键-值对条件):db.collection_name.remove({})

5、客户端操作:nosqlbooster4mongo

1、客户端安装

官网下载.exe安装包文件(https://nosqlbooster.com/downloads),双击直接安装即可。

2、SSH登录

注意,我的MongoDB服务是安装在Ubuntu系统上的
安装完成后,我是SSH方式登录:
点击connect–>create,然后进入Basic标签页:其中Sever为MongoDB的配置文件( cat etc/mongod.conf )中net指定的ip、port(如下),Name是连接后显示的连名字。

# network interfaces
net:
  port: 27017
  bindIp: 127.0.0.1

在这里插入图片描述
然后切换到SSH标签页:其中Address为MongoDB所在的机器真实ip,端口号为该机器SSH指定的端口号(需要确定SSH服务是启动的,且其端口已经被启用,在Ubuntu使用下面命令查看):

# 查看SSH服务是否为启动状态
sudo service ssh status
# 查看SSH使用的端口号
grep Port /etc/ssh/sshd_config
# 查看端口号启用情况,State为LISTEN表示正在监听,已启用
sudo netstat -plnt

输入正确的用户名、密码就可以成功访问了。
在这里插入图片描述

6、python操作

1)Python连接数据库:

1)SSH连接:

import pymongo
from sshtunnel import SSHTunnelForwarder
import atexit
realskip_ip='192.168.52.110'
# mongodb_ip、real_mongodb_port为mongodb配置文件中的bindIp和port(配置文件默认在/etc/mongod.conf)
mongodb_ip='127.0.0.1' 
real_mongodb_port=27017
server = SSHTunnelForwarder((realskip_ip, 22),
							ssh_password='xxx',
							ssh_username='mmgg',
							remote_bind_address=(mongodb_ip, real_mongodb_port)) #mongodb默认端口27017
server.start()

self.client = pymongo.MongoClient('127.0.0.1', server.local_bind_port)
self.db = self.client[db_name]
self.coll=self.db[collection_name]

def shutdown():
    server.stop()
atexit.register(shutdown)

2)用户名、密码连接

# admin 账户 可以操作任意数据库
# 例如:用户名admin,密码admin*ccdd*kkyyxt,ip:192.fff.xxx.110,端口27017
client=pymongo.MongoClient('mongodb://admin:admin*cnkicnki*kyxt@192.fff.xxx.110:27017')

2)python批量操作

1、批量操作:bulk
1)

Bulk=db.collection.initialize_unordered_bulk_op() # 或 Bulk=db.collection.initialize_ordered_bulk_op()
# 然后进行相关操作定义,如:
Bulk.find()  # [可加.update({“$set”:{键值对}}) / .remove()]
Bulk.insert()
# 最后统一执行操作:
Bulk.execute()

2)批量写入:db.coll_name.bulk_write( seq ) 。注意seq格式是操作函数组成的列表
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

7、挂掉的一些情况与对策

1)too many open files原因挂掉
在这里插入图片描述
解决:
增大系统的open file对应的ulimit参数
(所有操作包括mongo的启动都要在一个shell里进行,且该修改命令只对这个shell起作用)
在这里插入图片描述

二、mysql 8

安装
1、CentOS7.9安装
安装之前需要卸载系统自带的MariaDB:

rpm -qa|grep mariadb
yum remove mariadb-libs -y

(1)安装命令
注意:最后安装时可能出现错误:The GPG keys listed for the "MySQL 8.0 Community Server" repository are already installed but they are not correct for this package. Check that the correct key URLs are configured for this repository.
解决:最后一句命令添加参数 --nogpgcheck, 作用是 “禁掉GPG验证检查”

wget http://repo.mysql.com/mysql80-community-release-el7-3.noarch.rpm
rpm -ivh mysql80-community-release-el7-3.noarch.rpm 
yum update 
yum install mysql-community-server --nogpgcheck # 安装mysql

(2)启动mysql
CentOS7.9(同Ubuntu):

service mysqld start

window10

net start mysql80  # 关闭是:net stop mysql80

(3)进入mysql更改密码

grep 'temporary password' /var/log/mysqld.log   # DOS中查看默认密码
mysql -u root -p # 使用该密码进入mysql
ALTER USER 'root'@'localhost' IDENTIFIED BY 'xxxx@2022'; # 更改(设置)密码

2、win10安装完成后,Navicat连接出现 2059 错误:
 原因:在mysql8之前的版本中加密规则为mysql_native_password,而在mysql8以后的加密规则为caching_sha2_password。
 解决:cmd进入mysql,并执行下述命令

 ALTER USER 'root'@'localhost' IDENTIFIED BY 'your password' PASSWORD EXPIRE NEVER; # 作废原密码
 ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your password'; # 修改加密规则并设置新密码

 如下图:
在这里插入图片描述
常用引擎
InnoDB 引擎:提供ACID事务支持,提供行级锁和外键约束等,在读写操作时不锁表,所以适合并发度较高的场景使用。
MyISAM 引擎:不提供ACID事务支持,执行写操作的时候会锁表,但会存储表行数,因此查询结果数量时不需要进行全表扫描。

1、基于命令行操作

基本说明:
1、数据类型
1)文本有4有类型:

TINYTEXT 256bytes
TEXT 64kb
MEDIUMTEXT 16Mb
LONGTEXT 4GB

2)时间类型

DATE # 仅年月日,格式:1000-01-01 (占三个字节)
DATETIME # 日期和时间,范围:1000-01-01 00:00:00' ~ '9999-12-31 23:59:59 (占8个字节)
TIMESTAMP # 日期和时间,和时区关联, 范围:'1970-01-01 00:00:01'  ~ '2038-01-19 03:14:07'(占4个字节)

3)json类型
json最大能够存储4G的数据。
2、数据值型字段不能为空null:int、float、decimal(精确数值)

1)Mysql导出库表结构和数据以及导入脚本到数据库

(1)导出库表结构和数据:mysqldump
在这里插入图片描述
(2)导入数据库脚本:source
①脚本中有创建库直接进mysql环境 :source filePath;
②没有创建库,进mysql环境然后:

create database databse_name; 
use database database_name;
source filePath

报错1:ERROR 2005 (HY000): Unknown MySQL server host 'xxxx'
 原因:可能是导出和导入的编码不一致,可以尝试导入编码utf8、gbk、gb2312等;也可能是mysql低版本导入到高版本所致。
 解决:进入数据库使用命令: mysql -u root -p --default-character-set=utf8
报错2:Failed to open file 'xxx.sql', error: 2
 解决:cmd中从.sql文件所在的路径进入mysql

2)为mysql数据库用户授权

在这里插入图片描述
【授予所有权限:
在这里插入图片描述

3)查看数据库/表占空间大小

进入目标数据库:use information_schema;
在这里插入图片描述

4)查看各个用户信息:

root账号下查看,但是密码是加密的,无法查看。
在这里插入图片描述

5、使用ibd文件恢复数据

mysql8.0之后没有frm数据结构文件了,但使用 ibd2sdi 命令可以生成类似的TXT文件:
进入 ibd 文件所在的路径(Ubuntu默认:/var/lib/mysql/)

ibd2sdi --dump-file=解析后的文件名.txt 要解析的表名.ibd

TXT 文件中内容如下:

["ibd2sdi",
{
   
	"type": 1,
	"id": 379,
	"object":
		{
   
    "mysqld_version_id": 80021,
    "dd_version": 80021,
    "sdi_version": 80019,
    "dd_object_type": "Table",
    "dd_object": {
   
        "name": "reviews_2019",
        "mysql_version_id": 80021,
        "created": 20200925073618,
        "last_altered": 20200925073618,
        "hidden": 1,
        "options": "avg_row_length=0;encrypt_type=N;key_block_size=0;keys_disabled=0;pack_record=1;stats_auto_recalc=0;stats_sample_pages=0;",
        "columns": [
            {
   
                "name": "篇名",
                "type": 27,
                "is_nullable": false,
                "is_zerofill": false,
                "is_unsigned": false,
                "is_auto_increment": false,
                "is_virtual": false,
                "hidden": 1,
                "ordinal_position": 1,
                "char_length": 65535,
                "numeric_precision": 0,
                "numeric_scale": 0,
                "numeric_scale_null": true,
                "datetime_precision": 0,
                "datetime_precision_null": 1,
                "has_no_default": true,
                "default_value_null": false,
                "srs_id_null": true,
                "srs_id": 0,
                "default_value": "AAAAAAAAAAAAAA==",
                "default_value_utf8_null": true,
                "default_value_utf8": "",
                "default_option": "",
                "update_option": "",
                "comment": "",
                "generation_expression": "",
                "generation_expression_utf8": "",
                "options": "interval_count=0;",
                "se_private_data": "table_id=1086;",
                "engine_attribute": "",
                "secondary_engine_attribute": "",
                "column_key": 1,
                "column_type_utf8": "text",
                "elements": [],
                "collation_id": 255,
                "is_explicit_collation": false
            },

使用 ibd 文件恢复数据:
1)创建一个完全一样的数据表(表结构必须与需要恢复的表结构完全一致)
2)移除该表的表空间(会把自生成的 ibd 文件移除):

mysql> alter table reviews_2019 DISCARD TABLESPACE;
Query OK, 0 rows affected (0.02 sec)

3)将 ibd 文件复制到该表 ibd 文件所在路径中

cp reviews_2019.ibd /var/lib/mysql/reviews_pkg/

4)导入表空间(会将复制的新 ibd文件导入到表中)

mysql> alter table reviews_2019 IMPORT TABLESPACE;
Query OK, 0 rows affected, 1 warning (26.42 sec) # 查看warning:show warnings;

导入过程中可能会出现文件操作权限不够,导致import不成功:

chmod 777  /var/lib/mysql/reviews_pkg/reviews_2019.ibd # 修改文件的操作权限

2、基于客户端界面操作(Navicat+SQL):

小问题:
1、从db1复制table1到db2中可以直接通过表拖拽操作完成。
2、将Excel直接导入mysql(导入操作过程中,可以选择自动建表):
不成功,看错误原因,很大可能是字段长度或数据类型设置不合适(自动建表过程中默认全是vachar(255))。
SQL:

1)CREATE创建

(1)创建表
表创建完成后一定记得添加索引,否则后期使用时速度巨慢。
必须要指定各个字段的数据类型;
primary key对应的值必须不为空且值唯一;只有一个???

CREATE TABLE IF NOT EXISTS %s
                        (id INT PRIMARY KEY,
                         中文关键词 TEXT,
                         年 TEXT,
                         篇名 TEXT NOT NULL UNIQUE,  # 非空且值唯一
                         核心期刊 VARCHAR(32),
                         s_index JSON,
                         被引频次 INT,
                         PRIMARY KEY (篇名, 年), # 主码有两个属性时,需作为表级别完整性约束定义
                         index index_fenleihao(分类号(127))) # index关键字也可以替换为KEY,作用一样
                         ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 # 设置表的编码格式,防止写入特殊中文报错

(2)创建索引(索引可以基于多列共同创建,称为复合索引):CREATE INDEX indexName ON paper_yx_all(id, fenleihao(127));
(3)删除数据库:drop database dbname;
(4)删除表:drop table table_name;

2)SELECT查询(包括部分show操作)

(1)子查询复用:用子查询结果生成新的表,再次进行查询
在这里插入图片描述
(2)连接查询
① 等值连接 非等值连接 “自然连接”

SELECT *
from my_test, my_test1
WHERE my_test.name = my_test1.name; # “=” 换乘>=、 <、 !=或<>时为非等值连接
# 自然连接:在等值连接中把目标列中重复属性列去掉
SELECT my_test.name, age, address, height, work_address
from my_test, my_test1
WHERE my_test.name = my_test1.name;


(2)查询除某个字段名之外的其他字段名
在这里插入图片描述
(2)查看某个表的结构:

mysql> DESCRIBE check_data; # 也可以简写为 DESC check_data

结果:
在这里插入图片描述
(2-1)show命令查看表结构——各个字段属性设置

mysql> show full columns from reviews_CJFDTOTAL;

结果:
在这里插入图片描述

(3)查询某字段不为空的记录
在这里插入图片描述
(4)嵌套查询
① IN查询

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值