mysql pymysql 使用

相关信息在/etc/my.cnf中

文章目录

    • mysql
        • 进出mysql
        • 查看编码、索引、端口、文件路径
        • mysql 用户管理
        • mysql 参看库,表的信息
        • mysql 查看表中信息
        • mysql 新建、删除表 管理主键、列名
        • mysql 插入 更新 删除行
        • mysql 事务操作
    • python pymysql
        • python pymysql库的使用
        • pymysql 连接数据库
        • pymysql 建表
        • pymysql 上传到数据库
        • mysql 出现的问题

mysql

进出mysql

# 进入本机mysql
mysql -u 用户名 -p密码    # mysql -u root -proot p后直接跟密码
mysql -h localhost -u root -proot 
mysql -h 127.0.0.1 -u root -proot
#连接到远程主机上的mysql
mysql -h 远程主机地址 -u test -p123
'''
-h 有三种参数 
%:任意主机
localhost:仅本地可以登录(比127.0.0.0更优)
	localhost和127.0.0.1大致下一样,区别:
		localhost:
			无需联网
			不适用网卡,不受网络防火墙和网卡的限制,不会解析成ip,不占网卡、网络资源。
			本机访问
		127.0.0.1:
			无需联网
			网卡传输,受网络防火墙和网卡限制
			本机访问
		本机ip
			联网
			网卡传输,受防火墙和网卡限制
			本机或外部访问
		
Ip地址:指定的ip可登录
'''

# 退出mysql
mysql> quit;

查看编码、索引、端口、文件路径

# 查看数据文件存放路径
mysql> show variables like '%datadir%';
# 查看用户使用端口
mysql> show variables like 'port';
#查看每个库所使用的编码
mysql> show variables like 'character%';
# 查看表中的索引,两种方式:
mysql> show index from 表名;
mysql> desc 表名;(看哪个是主键 PRI)

mysql 用户管理

# 查看现在所使用的用户名
mysql> select user();
# 查看所有的用户的信息,(有个库加mysql,里有个表叫user,里有用户的信息)
mysql> select User,Host,Password from mysql.user; 
# 创建用户
mysql> create user '用户名'@'ip地址' identified by '密码';
	# ip地址:
    	# %:任意主机;localhost:仅本地可以登录;Ip地址:指定的ip可登录
	# 若无需密码
    	# identified 及其后面可以不用写
    # 一般形式
    	mysql> create user 'test'@'%' identified by '123'

# 查看某个用户的权限
mysql> show grants for '用户'@'ip';
	eg: show grants for 'test'@'%';
# 给某个用户的授权
mysql> grant 权限 on 数据库.表 to '用户'@'ip';
		eg: grant all privileges on 库名.表名 to 'test'@'%';
        	grant select,insert,update,delete on 
	'''
	
	数据库名.*           数据库中的所有表
	数据库名.表          指定数据库中的某张表
	数据库名.存储过程     指定数据库中的存储过程
	*.*                所有数据库中的所有表
	
	usage 无访问权限
	select 查看权限
	insert 插入权限
	alter 更改表权限
	create 创建表权限
	create user 创建用户权限
	drop 删除表权限
	update 
	delect 
	'''
# 给某个用户取消某个权限
mysql> revoke 权限 on 数据库.from '用户'@'ip'
        
# 修改用户密码        
mysql> set password for '用户名'@'ip地址' = password('新密码')
# 删除用户
mysql> drop user '用户名'@'ip地址'
	# mysql> drop user 'test'@'%';

mysql 参看库,表的信息

# 显示有几个库
mysql> show databases;
# 进入gao库
mysql> use gao;
# 查看当前使用的是哪个数据库
mysql> select database();
# 查看gao库中有几个表
mysql> show tables;
# 查看表的某个表的结构
mysql> desc one_table;

mysql 查看表中信息

# 查看表中的所有数据
mysql> select * from biao1;
# 查看表中的某些列的数据
mysql> select name,age from ku1.biao1;
	eg: select User,Host from mysql.user;#数据库中mysql库下的user表
# 查看表中sex=0的所有的数据
mysql> select * from biao1 where sex=0;
# 查看表中sex=0的所有的数据的某些列
mysql> select name,age from biao1 where sex=0;
# explain:可看是否通过主键索引进行查询,显示了 mysql 如何使用索引来处理 select 语句以及连接表
mysql> explain select name,age from biao1 where sex=0;
mysql> select * from biao1 where id>1 and name != 'mign' and sex=0 and age between 5 and 14 and num in (3,6,8) and count not in (3,12);

# 限制查看
mysql> select * from biao1 limit 5; #前5行
mysql> select * from biao1 limit 45;#从第4行开始的前5行
# 规则查看
# 查看biao1中所有name='li'+字符串的数据 eg: lie,liaing
mysql> select * from biao1 where name like 'li%';
#查看biao1中所有name='li'+一个字符 的数据 eg: lie,lia
mysql> select * from biao1 where name like 'li_';

# 排序查看
mysql> select * from biao1 order by name asc; #根据name列,从小到大排列
mysql> select * from biao1 order by name desc; #根据name列,从大到小排列
mysql> select * from biao1 order by name asc,age desc; #根据name从小到大排,若相同,按age从大到下排

# 显示河南省有多少个市,此时列名是count(city_name)
mysql> select count(city_name) from city where city_province='河南省';
# 显示河南省有多少个市,使得列名为num
mysql> select count(city_name) as num from city where city_province='河南省';
# 显示各省份分别有多少个市
mysql> select city_province,count(city_name) as num from city group by city_province;
# 显示超过10个市的省份都有多少的市
mysql> select city_province,count(city_name) from city group by city_province having count(city_name)>10;

mysql 新建、删除表 管理主键、列名

# 创建表 一定要设置主键(是索引,当数据库中量大时,可加快查找速度)。null:可为空,not null:不可为空
# 数据类型
	# 数字 int(n) 存储时占4个字节 ,n表明了默认存的数的长度下限为n,不够n的会在前面补0,-2 147 483 648~2 147 483 647,或者 0~4 294 967 295(无符号,2^32-1)
    # 字符串 使用varchar(n)存储时占空间更小
    	# char(n) 存储时占n个字节,输入最大为n个字符,长度为 0~255 个字符 2^8-1
    	#varchar(n) 存储时占String长度+1个字节,最大为n个字符,长度为 0~65 535 个字符 2^16-1
mysql> create table biaoming(
    #默认自增(一表最多一个,做主键),插入数据时,可不用管它,primary key主键,一列的唯一索引,可有多列组合而成复合主键,此时每个字段都是索引
    	id int not null auto_increment primary key,
		name varchar(3) not null default 'hua',
    	age int(3) null default 18,
    	sex int(1) null,
     	primary key(name,sex) #复合主键,每个字段都是索引,为之后加快查找
		)default charset=utf8;

# 在初始未设置主键,表中有数据情况下,如果此时再设置主键(复合主键),两种情况:
1. 把表中的主键部分重复的删掉,再设置主键(但一般不现实)
2. 新建一张表,设置主键,把原来表中的数据插进来。

# 删除表
mysql> drop table biao1;

#修改列名
mysql> alter table biao1 modify column 列名 修改后的类型;
mysql> alter table biao1 change 原列名 新列名 修改后的类型;
#添加一列
mysql> alter table biao1 add 列名 类型;
#删除一列
mysql> alter table biao1 drop column 列名;

# 添加主键
alter table biao1 add primary key(列名);
# 删除主键
alter table biao1 drop primary key;#为主键的该列并不会消失,只是不再作为主键了,但当自增的id作为主键时,该命令无法执行,因为自增就意味着是主键

mysql 插入 更新 删除行

# 向表中插入一条数据
mysql> insert into biao1 values('li',32,0);#每个字段都插入
mysql> insert into biao1(name,age) values('li',22); #个别字段插入

# 向表中插入几条数据
mysql> insert into biao1 values
		('ling',2,0),
    	('dsf',321,0),
        ('lsa',323,0);
        
# 删除一行
mysql> delete from biao1 where name='dalian';
# 删除所有行,将biao1清空,列名还在
mysql> delete from biao1;  

# 更新数据,将biao中所有sex=0的行中的name改为'hua',age改为18
mysql> update biao1 set name='hua',age=18 where sex=0;

mysql 事务操作

# 事务操作(批处理:不用插入一次就提交一次浪费时间;也不是所有的插入后再提交,以免中间出错,前面的都操作失败,即便该次未提交成功,也只是该批次失败,未殃及全部):ACID 原子性(Atomicity),一致性(Consistency),隔离性(Isolation),持久性(Durability)
mysql> begin;#开启事务
mysql> insert into biao1 values('li',32,0);
mysql> mysql> insert into biao1 values
		('ling',2,0),
    	('dsf',321,0),
        ('lsa',323,0);
mysql> rollback;#此时上面的操作不算数。若是commit;事务确认

python pymysql

python pymysql库的使用

import pymysql

# 连接数据库-执行命令(事务提交)-》关闭游标-》关闭连接

#执行一个任务,返回的是影响的行数row_count
affect_rows = cur.execute('sql语句',缺省args) 
 # 占位符都用 %s
mysql> ret = cur.execute('insert into biao1(name,age) value(%s,%s)',('hua',12))
	或 ret=cur.execute('insert into biao1(name,age) values('li',12)');
	或  cur.execute('insert into biao1(name,age) values("%s",%d)'%('xiaoming',18))
   
# 一下执行多条同样任务
cur.executemany('sql语句',缺省args)
		# 占位符都用 %s ,第二个参数用[[],[]]或[(),()]
mysql> sql_insert = 'insert into biao1(name,age) values(%s,%s)'
mysql> param = [('hua',12),('peng',13),('ji',19)]
mysql> cur.execute(sql_insert,param)


cur.execute('select name,age from person')
#从当前光标把之下的全取了,最开始光标不在数据库里,故可以取出所有
res = cur.fetchall()# 根据cur的设置返回字典或元组,此时返回的是字典,所有的字典组成列表
# 从当前光标下取3条
res = cur.fetchmany(3)
# 从当前光标下取一条
res = cur.fetchone()

#在 fetch 数据时按照顺序进行,可以使用 cursor.scroll (num,mode) 来移动游标位置
# 主 
cur.scroll (1,mode='relative') # 相对当前位置移动【1:表示向下移动一行,-1:表示向上移动一行】
cur.scroll (2,mode='absolute') # 相对绝对位置移动 【2:表示向上移动两行,-1:表示向下移动一行】

# 对批次插入,更新,删除等改变数据库的任务,进行提交,是事务操作
conn.commit()

# 最后
# 关闭指针对象
cur.close()
# 关闭连接对象
conn.close()

pymysql 连接数据库

import pymysql
def connect_db(host,db,user,passwd,port=3306):
    # 建立数据库的连接
    conn = pymysql.connect(
    	host=host,#要连接的主机地址。在本地时,host='localhost'或'127.0.0.1'。
        port=port,
        user=user,#用户名
        passwd=passwd, #密码
        db=db, #mysql中的哪个数据库
        charset='utf8'
    )
    # 获取游标(类型设置为字典形式)
    cur = conn.cursor(cursor=pymysql.cursors.DictCursor)
    return cur,conn
cur,conn=connect_db('114.115.121.345','Movie','Movie','HLSiC',3306)

pymysql 建表

def creat_table(cur,conn):
    '''
    建新表 keyword_syn
    :param cur:
    :param conn:
    :return:
    '''
    sql_create = 'create table keyword_syn(
    keyword varchar(100) not null,
    syn varchar(100) not null,
    primary key(keyword,syn)# 复合主键
    )default charset=utf8'
    cur.execute(sql_create)
    conn.commit()

    # 返回新建表的情况
    cur.execute('desc keyword_syn')
    res = cur.fetchall()
    for i in range(len(res)):
        a = res[i]
        print('字段:%s 类型 %s'%(a['Field'],a['Type']))

pymysql 上传到数据库

def insert_to_keyword_syn(cur,conn,sql,data,one_commit_num):
    '''
    :param cur:
    :param conn:
    :param data: 列表,cur.executemany(sql,data)的data的形式
    :param one_commit_num: 一次事务提交的条目数
    :return:
    '''
    a = len(data)
    b = a/one_commit_num
    c = a/one_commit_num
    # 批次提交,一次是one_commit_num个,其中最后一次提交的数据的开始下标为begin_index_num
    begin_index_num = b if a>b else b-1

    i = 0
    while(i <= begin_index_num):
        if i == begin_index_num:
            args = data[one_commit_num*i:]
            try:
                cur.execute(sql,args)
                conn.commit() #事务提交
            except Exception as e:
                conn.rollback() #事务回滚
                print('下标%d处上传失败'%(i*one_commit_num),e)
            else:
                
                print('全部提交成功')
                i += 1 # 进行下一个批处理



        else:
            scale_begin = one_commit_num*i
            scale_end = one_commit_num*(i+1)
            args = data[scale_begin:scale_end] # eg: 1000*i~1000*i+999
            try:
                cur.executemany(sql,args)
                conn.commit() #事务提交
            except Exception as e:
                conn.rollback() #事务回滚
                print('下标%d处上传失败'%(i*one_commit_num),e)
            else:
                
                print('下标%d~%d提交成功'%(scale_begin,scale_end))
                i += 1 # 进行下一个批处理

mysql 出现的问题

登录服务器后,登录创建的mysql账户时:ERROR 1045 (28000): Access denied for user ‘test’@‘localhost’ (using password: YES)

#第一种原因,密码错了
#第二种原因,数据库有一个匿名用户(''@'localhost'或''@'127.0.0.1'),mysql会先匹配它,这样你的密码就一直是错的
	# 删掉该匿名账户
 drop user ''@'localhost';
 # 刷新
 flush privileges;

远程登录服务器的mysql服务器时:OperationalError: (2003, “Can’t connect to MySQL server on ‘62.234.53.229’ (timed out)”)

# 原因
宝塔防火墙的3306端口没有看开放

插入时遇到:1062, "Duplicate entry ‘茶馆-茶馆’ for key ‘PRIMARY’

在该表有两个字段 key_word, movie_name都是主键

问题是说:表中已经存在茶馆-茶馆了

解决方法:

  1. insert ignore into biao1 xx # ignore 保留表中的数据
  2. insert replace into biao1 xx # replace 替换掉表中的相同数据

你可能感兴趣的:(mysql pymysql 使用)