python2中操作数据库:MySQLdb
python3中操作数据库:pymysql
创新互联建站-专业网站定制、快速模板网站建设、高性价比清河网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式清河网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖清河地区。费用合理售后完善,10多年实体公司更值得信赖。
1.创建数据库连接:
mysql.connect()函数
2.执行数据库操作:
执行数据库操作,我们要使用连接对象获得一个cursor(游标)对象:
用连接对象的cursor()方法返回一个游标对象
接下来,我们会使用cursor提供的方法来进行工作. 这些方法包括两大类:1.执行命令,2.接收返回值
执行命令:
callproc(self, procname, args):用来执行存储过程,接收的参数为存储过程名和参数列表,返回值为受影响的行数
execute(self, query, args):执行单条sql语句,接收的参数为sql语句本身和使用的参数列表,返回值为受影响的行数,它执行查找语句时的返回值是查找到的记录条数。
executemany(self, query, args):执行单挑sql语句,但是重复执行参数列表里的参数,返回值为受影响的行数
nextset(self):移动到下一个结果集
接受返回值:
fetchall(self):接收全部的返回结果行.返回值也是元组,元组中的元素也是元组
fetchmany(self, size=None):接收size条返回结果行.如果size的值大于返回的结果行的数量,则会返回cursor.arraysize条数据.返回结果时元组,元组的元素是整条记录的元组
fetchone(self):返回一条结果行.游标移动到下一条记录开头
scroll(self, value, mode='relative'):移动指针到某一行.
如果mode='relative',则表示从当前所在行移动value条,value可以是负数,表示向前移动,正数表示向后移动
如果mode='absolute',则表示从结果集的第一行移动value条.value=0则表示结果集的开头,
游标属性:
游标对象.description:返回表的结构(包括字段名等),返回结果是一个元组,元组内元素是每个字段信息构成的元组
3.关闭数据库:
关闭数据库前先关闭游标:游标对象.close()
关闭数据库连接:连接对象.close()
select count(*) from tablename where col = 'col';
这种方法性能上有些浪费,没必要把全部记录查出来。
select 1 from tablename where col = 'col' limit 1;
执行这条sql语句,所影响的行数不是0就是1。
特别解释下limit 1,mysql在找到一条记录后就不会往下继续找了。性能提升很多。
结论:推荐第二种方式。
create user:没有任何权限只能登陆。
添加用户的同时赋予权限:grant user
在新添加用户时候,如果没有在用户名后指定本地登陆或者远程登陆,这个用户默认是可以远程登陆的。
drop user 可以同时删除多个允许远程登陆的用户(不用跟@'%')。
查看所有用户
SELECT User, Host, Password FROM mysql.user;
备份:
备份数据库mariadb下的所有表到文件mariadbdump
mysqldump -uroot -p mariadb >mariadb.dump
备份数据库mariadb下的所有表的结构到文件mariadbdump,不备份其中的数据
mysqldump -uroot -pwestos --no-data mariadb > `date +%Y_%m_%d`_mariadb.dump
备份所有的数据库的所有表到文件mariadbdump
mysqldump -uroot -pwestos --all-databases >mariadb4.dump
恢复:
mysqladmin -uroot -pwestos create mariadb2
mysql -uroot -pwestos mariadb2< mariadb.dump
----->在用python的MysqlDB包对Mysql进行insert操作时出现了问题,程序运行不报错,insert语句也没有问题,但是新的数据一直没有插入到数据库中。在查阅了资料之后,发现是未提交的原因。
数据库语言可分为四种,
数据操作语言(Date Manipulation Language)DML语言,实现对数据的基本操作,”增删改”。
UPDATE DELETE INSERT
数据定义语言(Data Definition Language )DDL语言,可以实现对数据库结构、操作方法等的定义:
create table 创建表
alter table 修改表
drop table 删除表
truncate table 删除表中所有行
create index 创建索引
drop index 删除索引**
数据库控制语言(Data Control Language)DCL授权,角色控制
GRANT 授权
REVOKE 取消授权
事务控制语言(Transaction Control Language)事务控制语言
SAVEPOINT 设置保存点
ROLLBACK 回滚
SET TRANSACTION
在这之中,DDL语句是自带commit的,而执行DML命令如果没有提交,将不会被其他会话看到。除非在DML命令之后执行了DDL命令或DCL命令,或用户退出会话,或终止实例,此时系统会自动发出commit命令,使未提交的DML命令提交。
所以在执行了UPDATE,INSERT操作都执行一下提交命令:连接对象.commit()
另外,在连接数据库的时候,有一个默认参数:autocommit,它默认值为False,在连接数据库的时候设置这个参数autocommit=True,就可以不用再调用commit()方法了。
参考博客:https://blog.csdn.net/lee_zix/article/details/52216126
----->mysql语句中----删除表数据drop、truncate和delete的用法:
程度从强到弱
1、drop table tb
drop将表格直接删除,没有办法找回
2、truncate (table) tb
删除表中的所有数据,不能与where一起使用
3、delete from tb (where)
删除表中的数据(可制定某一行)
区别:truncate和delete的区别
1、事务:truncate是不可以rollback的,但是delete是可以rollback的;
原因:truncate删除整表数据(ddl语句,隐式提交),delete是一行一行的删除,可以rollback
2、效果:truncate删除后将重新水平线和索引(id从零开始) ,delete不会删除索引
3、 truncate 不能触发任何Delete触发器。
4、delete 删除可以返回行数
来自:https://www.cnblogs.com/shuaiandjun/p/6042600.html
"""
"""
def list_col(localhost, username, password, database, tabls_name):
db = pymysql.connect(localhost, username, password, database, charset="utf8")
cursor = db.cursor()
cursor.execute("select * from %s" % tabls_name)
col_name_list = [tuple[0] for tuple in cursor.description]
db.close()
return col_name_list
def list_table(localhost, username, password, database):
db = pymysql.connect(localhost, username, password, database, charset="utf8")
cursor = db.cursor()
cursor.execute("show tables")
table_list = [tuple[0] for tuple in cursor.fetchall()]
db.close()
return table_list
例子:
import pymysql as mysql
u = 'root'
p = 'westos'
d = 'python'
# connect函数创建数据库或者打开数据库,返回一个数据库的连接对象,程序员通过连接对象访问数据库
conn = mysql.connect(user=u,passwd=p,db=d,charset='utf8',autocommit=True)
#cursor函数创建一个游标
cur = conn.cursor()
#execute函数执行sql语句
try:
cur.execute('create table employee(id int,name varchar(20),age int,sex enum("男","女"),salary int,department varchar(40));')
cur.execute('insert into employee values(1,"张三",18,"男",5000,"IT部门"),(3,"李四",20,"男",6000,"市场部"),(2,"小红",28,"女",10000,"人事部");')
cur.execute('delete from employee where name="张三";')
cur.execute('update employee set sex="女" where name ="李四";')
except:
print("error......11111......")
else:
print('success....11111......')
li = [(i,'user'+str(i),123456) for i in range(1,21)]
try:
cur.executemany('insert into users values(%s,%s,%s);',li)
cur.execute('select * from users;')
except:
print("error......222......")
else:
print('success....222......')
#用tmp来接收从数据库查询到的所有记录。
tmp = cur.fetchall()
cur.close()
conn.close()
for i in tmp:
print(i)