zoukankan      html  css  js  c++  java
  • MongoDB、MySQL

    我的电脑的系统Path:
     
    D:sqlite;D:Program FilesMongoDBServer3.4in;%MYSQL_HOME%in;D:Program FilesBrowserPython 3.6;D:Program FilesBrowserPython 3.6Scripts;C:Program Files (x86)WorkSSH Secure Shell;C:Program Files (x86)Microsoft OfficeFiddler
    ****************************************分割线****************************************
    安装MongoDB:
     
    www.mongodb.com/download-center#community下载.msi安装包→
    自定义安装时把路径首的盘符C改为D,其他如Server3.x等可不改→
    手动创建日志文件D:Program FilesMongoDBlogmongodb.log;数据目录D:Program FilesMongoDBdata→
    D:Program FilesMongoDBServer3.4in下按Shift+右键进入命令窗口→
    mongod --logpath "D:Program FilesMongoDBlogmongodb.log" --dbpath "D:Program FilesMongoDBdata" --install --serviceName "MongoDB"
    (卸载的移除是--remove)→net start mongodb(关闭是stop)→浏览器打开http://localhost:27017
     
    cmd直接用mongo:把这串加入系统环境path:D:Program FilesMongoDBServer3.4in;
    *******************分割线*******************
    PyCharm装了Mongo Plugin插件(setting→Plugins→Browse repositories→Mongo Plugin),右端Mongo Explorer点开是空白:Mongo Settings扳手→+→Lable如Cheng→OK;
    打开数据表后,点击右上角的View as table按钮,把树型改为表型
    *******************分割线*******************
    mongodb使用范例:(爬取花椒直播)
     
    import requests, re
    from bs4 import BeautifulSoup
    from pymongo import MongoClient
     
    client = MongoClient('localhost',27017)    #port是int型;host和port用默认的也可省略不写
    db = client.花椒    #或client['花椒'];Mongodb中若无此数据库,则自动创建
    table = db.主播信息    #或db['主播信息']
     
    def getLiveId(urlOfAnchors):
        liveIds = set()
        html = requests.get(urlOfAnchors).text
        soup = BeautifulSoup(html, 'lxml')
        # 正则元字符^后面的(),不再表示group(n),而表示开头是一串内容
        for link in soup('a', href=re.compile('^(/l/)')):
            liveId = link['href'].split('/')[-1]
            liveIds.add(liveId)
        return liveIds
     
    def getUserId(liveId):
        liveUrl = f'http://www.huajiao.com/l/{liveId}'
        html = requests.get(liveUrl).text
        soup = BeautifulSoup(html, 'lxml')
        title = soup.title.get_text()
        return re.findall('d+', title)[0]
     
    def getUserData(userId):
        print(f'正在获取id为:{userId}的主播信息')
        html = requests.get(f'http://www.huajiao.com/user/{userId}').text
        soup = BeautifulSoup(html, 'lxml')
        userInfo = soup.find('div', id='userInfo')
        data = {}
        data['userId'] = userId
        data['headPhoto'] = userInfo.find('div','avatar').img['src']
        data['userName'],data['area'] = userInfo.h3.get_text('|',strip=True).split('|')[::2][:2]
        tmp = userInfo.find('ul', 'clearfix').get_text('|', strip=True).split('|')
        data['fans'],data['thumbsUp'],data['gift'],data['expense'] = tmp[::2][:4]
        return data
     
    def saveUserData(userData):
        table.save(userData)
        print(f"主播{userData['userName']}的信息已保存")
     
    if __name__ == '__main__':
        urlOfAnchors = 'http://www.huajiao.com/category/1000'
        liveIds = getLiveId(urlOfAnchors)
        for liveId in liveIds:
            userId = getUserId(liveId)
            try:  # getUserId()有些liveUrl打开较慢,跳过它们
                userData = getUserData(userId)
                saveUserData(userData)
            except:
                pass
    *******************分割线*******************
    查询输出之法1——PyCharm中print:
     
    from pymongo import MongoClient
     
    client = MongoClient('localhost', 27017)
    db = client.花椒
    table = db.主播信息
     
    rows = table.find()
    for item in rows:
        print(item)    #print(item.keys());item['userName']
     
    查询输出之法2——控制台:
    打开cmd,依次输入后回车:mongo;show databases;use 花椒;show tables;db.主播信息.count();db.主播信息.findOne();db.主播信息.find()
    ****************************************分割线****************************************
    mysql 5.7.19:
     
    1、安装&配置:
    ①下载包解压到E:mysql-5.7.19-winx64→环境变量の系统变量の新建:变量名MYSQL_HOME,变量值E:mysql-5.7.19-winx64→用户变量的Path尾添加个;%MYSQL_HOME%in→E:mysql-5.7.19-winx64in下建个my.ini文件(老版本不必;内容在文末);
    ②管理员身份打开cmd并切到bin目录下(下文各命令都是在此目录执行):mysqld.exe -install(提示:Service successfully installed)→mysqld --initialize-insecure --user=mysql(初始化时创建个空密码的root);
    ③net start mysql→mysqladmin -u root -p password 新密码如ChengYong→Enter password:(若旧密码为空则直接回车)→net stop mysql(卸载mysql是mysqld --remove)
     
    2、使用:
    法①のcmd:net start mysql→mysql -u root -p→Enter password:新密码(…操作示例:mysql>show databases;或mysql>select 语句…;)→mysql>quit;→net stop mysql
     
    法②のNavicat:net start mysql→打开软件Navicat→连接MySQL→除密码外随意(不过Navicat中的localhost只在联网时被DNS解析为127.0.0.1,断网用此软件,主机名得用127.0.0.1)→连接测试。
     
    若插入的数据含QQ表情,则新建数据库时(或右键目标库选数据库属性),字符集选末尾的utf8mb4。
     
    查看数据库信息、表、字段:右键库名选命令列界面→①show create database 库名;②show create table 表名;③desc 某字段名;
     
    添加用户:用户图标→新建用户→主机名为localhost,密码可空→保存按钮;权限管理员→选择左侧的连接名或下一级的某库名→添加权限→左侧勾选新用户→右键授予选全部授予→确定。
     
    3、my.ini里的内容:
    [client]
    port=3306
    default-character-set=utf8mb4
    [mysqld]
    port=3306
    character_set_server=utf8mb4
    basedir=%MYSQL_HOME%
    datadir=%MYSQL_HOME%data
    [WinMySQLAdmin]
    %MYSQL_HOME%inmysqld.exe
    *******************分割线*******************
    MySQL:
     
    连库相关:
     
    pymysql(或MySQLdb)异于django的DATABASES:port值非str是int;库名非name叫db;加charset参数。

    连接个事先手动创建的utf8mb4库,否则作用于字段的charset无效,如表般被库的默认编码硬统一了。
    用utf8mb4而非utf8,因为MySql中的utf8编码有bug,没能覆盖unicode字符。
     
    若数据库非要用代码创建,则要在代码中分别指定数据库、表字段的编码;麻烦不建议:
    self.cur.execute('create database if not exists myDB default charset utf8mb4')
    self.conn.set_character_set('utf8mb4')  #字段的编码:MySQLdb行,pymysql无此属性
    self.conn.select_db('myDB')    #或self.cur.execute('use myDB');若connect时没加db
    self.cur.execute('create table if not exists xs(name varchar(10),role text)')。
    ******分割线******
    SQL相关:
     
    ①SQL语句除set赋值外,where等值判断也是用的一个=,而非Python中的==;
    ②增删改查的前3个insert into t() values()、delete from t where…、update t set…where…,都是1句cur.execute(SQL),加1句conn.commit();或合并为1句conn.commit(cur.execute(SQL))。只有select…from t where…,第2句是cur.fetch…();或合并为1句cur.fetch…(cur.execute(SQL))。
     
    避免重复插入记录时报错:
    ①:insert ignore into t() values();
    ②:replace into t(各字段) values(各值);
    ③:for row in rows:sql=f'insert into t(a,b,c) values({row[0:3]}) on duplicate key update b=b+1,c={row[2]}'
     
    格式化方式{},Sqlite和MySQL这两种数据库都支持;Sqlite还支持?,MySQL还支持%s。
    SQL中各%s所对应的值,若和SQL字串写在一句内,则各%s要套引号;若写在execute…()的2参,即execute(sql,(*,*)),或多组的executemany(sql,[(*,*),(*,*)]),各%s两边无"。2参中,同一条记录的多个字段的值写在tuple内,而多条记录写在list内。
    ******分割线******
    示例:
     
    import pymysql
     
    class MySQLExample:
        def __init__(self):
            self.conn=pymysql.connect(host='localhost', port=3306, user='chengy', password='',
                db='myDB', charset='utf8mb4')  #password或passwd,database或db均可
            self.cur=self.conn.cursor(pymysql.cursors.DictCursor)  #fetch…默认((),(),),改用[{},{},]
     
        def operateDatabase(self):
            增='insert into xs(name,role) value(%s,%s)'    #value或values均可
            多条记录=[('张三','学生'),('李四','学生'),('李刚','家长'),('王丽','老师')]
            self.cur.executemany(增,多条记录)    #插入效率,executemany比execute高
            删='delete from xs where role="老师"'  #删除所有的老师
            改='update xs set role="校长" where name="李刚"'    #更改所有的李刚的角色
            self.cur.execute(删)
            self.cur.execute(改)
            self.conn.commit()  #self.conn.rollback()
     
            查='select * from xs where name="张三"'
            self.cur.execute(查)
            if self.cur.rowcount != 0:  #如果这条select查询有记录返回
                指针当前所移动至的记录的id字段 = self.cur.fetchone()['id']  #fetchmany(5)
                self.cur.scroll(0,'absolute')   #执行fetchone()或fetchmany(n)后指针↓了,移回原点
                print(self.cur.fetchall())
     
        def closeDatabase(self):
            self.cur.close()
            self.conn.close()
     
    xs=MySQLExample()
    xs.operateDatabase()
    xs.closeDatabase()
    ****************************************分割线****************************************
    prettytable:可把等长()的[],即[(),(),()…]显示为MySQL风格的表,似Mongo插件。
     
    Egの取甲丙丁这3列的前7行,按丙列降序,右对齐除了甲列左对齐,首列红色尾列橙色:
    import numpy
    from prettytable import PrettyTable
    from colorama import Fore,init
    init(convert=True)  #输出在:Win控制台启用本句,其他系统和PyCharm则注释
     
    pt=PrettyTable(list('甲乙丙丁'),fields=list('甲丙丁'),start=0,end=7,sortby='丙',reversesort=True)
    pt.align='r';pt.align['甲']='l'
    matrix=numpy.random.randint(1,4000,[9,4])
    [pt.add_row(row) for row in matrix]
    for row in pt._rows:
        row[0]=Fore.RED+str(row[0])+Fore.RESET
        row[-1]=Fore.YELLOW+str(row[-1])+Fore.RESET
    print(matrix,pt,sep=' ')
  • 相关阅读:
    元素查找
    合并果子 2004年NOIP全国联赛普及组
    队列练习1,2,3
    山峰
    栈练习1,2,3
    天使之城
    括号序列
    布尔表达式
    逆波兰表达式
    旅行家的预算 1999年NOIP全国联赛普及组NOIP全国联赛提高组
  • 原文地址:https://www.cnblogs.com/scrooge/p/7693875.html
Copyright © 2011-2022 走看看