python2中操作數(shù)據(jù)庫:MySQLdb
python3中操作數(shù)據(jù)庫:pymysql
創(chuàng)新互聯(lián)建站-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比清河網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式清河網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋清河地區(qū)。費(fèi)用合理售后完善,10多年實(shí)體公司更值得信賴。
1.創(chuàng)建數(shù)據(jù)庫連接:
mysql.connect()函數(shù)
2.執(zhí)行數(shù)據(jù)庫操作:
執(zhí)行數(shù)據(jù)庫操作,我們要使用連接對象獲得一個cursor(游標(biāo))對象:
用連接對象的cursor()方法返回一個游標(biāo)對象
接下來,我們會使用cursor提供的方法來進(jìn)行工作. 這些方法包括兩大類:1.執(zhí)行命令,2.接收返回值
執(zhí)行命令:
callproc(self, procname, args):用來執(zhí)行存儲過程,接收的參數(shù)為存儲過程名和參數(shù)列表,返回值為受影響的行數(shù)
execute(self, query, args):執(zhí)行單條sql語句,接收的參數(shù)為sql語句本身和使用的參數(shù)列表,返回值為受影響的行數(shù),它執(zhí)行查找語句時的返回值是查找到的記錄條數(shù)。
executemany(self, query, args):執(zhí)行單挑sql語句,但是重復(fù)執(zhí)行參數(shù)列表里的參數(shù),返回值為受影響的行數(shù)
nextset(self):移動到下一個結(jié)果集
接受返回值:
fetchall(self):接收全部的返回結(jié)果行.返回值也是元組,元組中的元素也是元組
fetchmany(self, size=None):接收size條返回結(jié)果行.如果size的值大于返回的結(jié)果行的數(shù)量,則會返回cursor.arraysize條數(shù)據(jù).返回結(jié)果時元組,元組的元素是整條記錄的元組
fetchone(self):返回一條結(jié)果行.游標(biāo)移動到下一條記錄開頭
scroll(self, value, mode='relative'):移動指針到某一行.
如果mode='relative',則表示從當(dāng)前所在行移動value條,value可以是負(fù)數(shù),表示向前移動,正數(shù)表示向后移動
如果mode='absolute',則表示從結(jié)果集的第一行移動value條.value=0則表示結(jié)果集的開頭,
游標(biāo)屬性:
游標(biāo)對象.description:返回表的結(jié)構(gòu)(包括字段名等),返回結(jié)果是一個元組,元組內(nèi)元素是每個字段信息構(gòu)成的元組
3.關(guān)閉數(shù)據(jù)庫:
關(guān)閉數(shù)據(jù)庫前先關(guān)閉游標(biāo):游標(biāo)對象.close()
關(guān)閉數(shù)據(jù)庫連接:連接對象.close()
select count(*) from tablename where col = 'col';
這種方法性能上有些浪費(fèi),沒必要把全部記錄查出來。
select 1 from tablename where col = 'col' limit 1;
執(zhí)行這條sql語句,所影響的行數(shù)不是0就是1。
特別解釋下limit 1,mysql在找到一條記錄后就不會往下繼續(xù)找了。性能提升很多。
結(jié)論:推薦第二種方式。
create user:沒有任何權(quán)限只能登陸。
添加用戶的同時賦予權(quán)限:grant user
在新添加用戶時候,如果沒有在用戶名后指定本地登陸或者遠(yuǎn)程登陸,這個用戶默認(rèn)是可以遠(yuǎn)程登陸的。
drop user 可以同時刪除多個允許遠(yuǎn)程登陸的用戶(不用跟@'%')。
查看所有用戶
SELECT User, Host, Password FROM mysql.user;
備份:
備份數(shù)據(jù)庫mariadb下的所有表到文件mariadbdump
mysqldump -uroot -p mariadb >mariadb.dump
備份數(shù)據(jù)庫mariadb下的所有表的結(jié)構(gòu)到文件mariadbdump,不備份其中的數(shù)據(jù)
mysqldump -uroot -pwestos --no-data mariadb > `date +%Y_%m_%d`_mariadb.dump
備份所有的數(shù)據(jù)庫的所有表到文件mariadbdump
mysqldump -uroot -pwestos --all-databases >mariadb4.dump
恢復(fù):
mysqladmin -uroot -pwestos create mariadb2
mysql -uroot -pwestos mariadb2< mariadb.dump
----->在用python的MysqlDB包對Mysql進(jìn)行insert操作時出現(xiàn)了問題,程序運(yùn)行不報錯,insert語句也沒有問題,但是新的數(shù)據(jù)一直沒有插入到數(shù)據(jù)庫中。在查閱了資料之后,發(fā)現(xiàn)是未提交的原因。
數(shù)據(jù)庫語言可分為四種,
數(shù)據(jù)操作語言(Date Manipulation Language)DML語言,實(shí)現(xiàn)對數(shù)據(jù)的基本操作,”增刪改”。
UPDATE DELETE INSERT
數(shù)據(jù)定義語言(Data Definition Language )DDL語言,可以實(shí)現(xiàn)對數(shù)據(jù)庫結(jié)構(gòu)、操作方法等的定義:
create table 創(chuàng)建表
alter table 修改表
drop table 刪除表
truncate table 刪除表中所有行
create index 創(chuàng)建索引
drop index 刪除索引**
數(shù)據(jù)庫控制語言(Data Control Language)DCL授權(quán),角色控制
GRANT 授權(quán)
REVOKE 取消授權(quán)
事務(wù)控制語言(Transaction Control Language)事務(wù)控制語言
SAVEPOINT 設(shè)置保存點(diǎn)
ROLLBACK 回滾
SET TRANSACTION
在這之中,DDL語句是自帶commit的,而執(zhí)行DML命令如果沒有提交,將不會被其他會話看到。除非在DML命令之后執(zhí)行了DDL命令或DCL命令,或用戶退出會話,或終止實(shí)例,此時系統(tǒng)會自動發(fā)出commit命令,使未提交的DML命令提交。
所以在執(zhí)行了UPDATE,INSERT操作都執(zhí)行一下提交命令:連接對象.commit()
另外,在連接數(shù)據(jù)庫的時候,有一個默認(rèn)參數(shù):autocommit,它默認(rèn)值為False,在連接數(shù)據(jù)庫的時候設(shè)置這個參數(shù)autocommit=True,就可以不用再調(diào)用commit()方法了。
參考博客:https://blog.csdn.net/lee_zix/article/details/52216126
----->mysql語句中----刪除表數(shù)據(jù)drop、truncate和delete的用法:
程度從強(qiáng)到弱
1、drop table tb
drop將表格直接刪除,沒有辦法找回
2、truncate (table) tb
刪除表中的所有數(shù)據(jù),不能與where一起使用
3、delete from tb (where)
刪除表中的數(shù)據(jù)(可制定某一行)
區(qū)別:truncate和delete的區(qū)別
1、事務(wù):truncate是不可以rollback的,但是delete是可以rollback的;
原因:truncate刪除整表數(shù)據(jù)(ddl語句,隱式提交),delete是一行一行的刪除,可以rollback
2、效果:truncate刪除后將重新水平線和索引(id從零開始) ,delete不會刪除索引
3、 truncate 不能觸發(fā)任何Delete觸發(fā)器。
4、delete 刪除可以返回行數(shù)
來自: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函數(shù)創(chuàng)建數(shù)據(jù)庫或者打開數(shù)據(jù)庫,返回一個數(shù)據(jù)庫的連接對象,程序員通過連接對象訪問數(shù)據(jù)庫
conn = mysql.connect(user=u,passwd=p,db=d,charset='utf8',autocommit=True)
#cursor函數(shù)創(chuàng)建一個游標(biāo)
cur = conn.cursor()
#execute函數(shù)執(zhí)行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來接收從數(shù)據(jù)庫查詢到的所有記錄。
tmp = cur.fetchall()
cur.close()
conn.close()
for i in tmp:
print(i)