Python数据库操作,针对pymysql 和 MYSQL数据库

此文将以MYSQL数据库做为例子,pymysql库作为驱动进行学习

安装MYSQL数据库与pymysql第三方库

  • 安装MYSQL数据库,请点击https://dev.mysql.com/downloads/installer/安装MYSQL的社区版本

  • 安装pymysql库不多做叙述

  • 安装navicat for mysql,此程序用来管理MYSQL数据库

    • 注意: 连接过程中可能会出现1251错误

    • 解决办法,在cmd命令下登录mysql后输入:

      • ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'mysql的密码'; 注意:引号中的为你自己设置的sql数据库的密码

      • FLUSH PRIVILEGES;

pymysql 连接mysql数据库的驱动库

  • Connection(host = None,user = None,password ='',database = None,port = 0,unix_socket = None,charset ='',sql_mode = None,read_default_file = None,conv = None,use_unicode = None,client_flag = 0,cursorclass = <class'pymysql.cursors.Cursor'>,init_command = None,connect_timeout = 10,ssl = None,read_default_group = None,compress = None,named_pipe = None,自动提交=假,分贝=无,passwd的=无,local_infile =假,max_allowed_pa​​cket个= 16777216,defer_connect =假,auth_plugin_map =无,read_timeout =无,write_timeout =无,bind_address =无,binary_prefix =假,程序名=无,server_public_key =无)

    • read_timeout - 以秒为单位读取连接的超时(默认值:无 - 无超时)
    • write_timeout - 以秒为单位写入连接的超时(默认值:无 - 无超时)
    • charset - 你要使用的Charset。
    • sql_mode - 要使用的默认SQL_MODE。
    • read_default_file - 指定my.cnf文件以从[client]部分下读取这些参数。
    • conv - 使用转换字典而不是默认字典。这用于提供类型的自定义编组和解组。见转换器。
    • use_unicode - 是否默认为unicode字符串。对于Py3k,此选项默认为true。
    • client_flag - 要发送给MySQL的自定义标志。在constants.CLIENT中查找潜在值。
    • cursorclass - 要使用的自定义游标类。
    • init_command - 建立连接时要运行的初始SQL语句。
    • connect_timeout - 连接时抛出异常之前的超时。(默认值:10,最小值:1,最大值:31536000)
    • ssl - 类似于mysql_ssl_set()参数的参数的dict。目前,不支持capath和cipher参数。
    • read_default_group - 要在配置文件中读取的组。
    • compress - 不支持
    • named_pipe - 不支持
    • autocommit - 自动提交模式。无表示使用服务器默认值。(默认值:False)
    • local_infile - 允许使用LOAD DATA LOCAL命令的布尔值。(默认值:False)
    • max_allowed_pa​​cket - 发送到服务器的最大数据包大小(以字节为单位)。(默认值:16MB)仅用于限制小于默认值(16KB)的“LOAD LOCAL INFILE”数据包的大小。
    • defer_connect - 不要明确连接contruction - 等待连接调用。(默认值:False)
    • auth_plugin_map - 插件名称的一个字典,用于处理该插件的类。该类将Connection对象作为构造函数的参数。该类需要一个认证方法,将认证包作为参数。对于对话框插件,可以使用提示(echo,prompt)方法(如果没有authenticate方法)从用户返回字符串。(实验)
    • server_public_key - SHA256 authenticnticaiton插件公钥值。(默认:无)
    • db - 数据库的别名。(与MySQLdb兼容)
    • passwd - 密码的别名。(与MySQLdb兼容)
    • binary_prefix - 在字节和bytearray上添加_binary前缀。(默认值:False)
  • 常用方法

    • select_db(db) 设置db为当前数据库

    • cursor() 创建一个游标对象,继而对数据进行操作

      • 游标对象方法:

      • execute(query,args = None ) 执行sql语句

      • executemany(query,args ) 运行多个sql语句

      • fetchall() 获取所有行

      • fetchmany(size = None ) 获取指定行数

      • fetchone() 获取下一行

      • close() 关闭游标,将缓存的数据全部释放到数据库中

    • commit() 提交对数据库中数据的修改,使之持久化到数据库中

    • close() 关闭套接字连接退出

SQL语句

  • SQL 是一门 ANSI 的标准计算机语言,用来访问和操作数据库系统

  • MySQL 数据类型

    • Text 类型
    image
    • Number 类型
    image
    • Date 类型
    image

SQL的语句分为两大类,一类是DML,另一类是DDL

数据定义语言 (DDL) 用于创建或删除表格

  • CREATE DATABASE 创建新数据库

    • 语句: CREATE DATABASE database_name
    import pymysql
    
    con = pymysql.connect('localhost','root','123456')
    
    sql = '''CREATE DATABASE test
    '''
    with con.cursor()as cursor:
        cursor.execute(sql)
    
    con.close()
    
  • CREATE TABLE 创建新表

    • 语句为以下形式,其中约束可以没有
    CREATE TABLE 表名称
    (
    列名称1 数据类型 约束,
    列名称2 数据类型 约束,
    列名称3 数据类型 约束,
    ....
    ) 
    
    • 约束条件

      • NOT NULL 值不能为空

      • UNIQUE 设置索引,一个表中可以有多个索引

        • 在创建表时,末尾加上该语句

        UNIQUE(列名称)

        • 表创建以后添加索引
        ALTER TABLE 表名称
        ADD UNIQUE (列名称) 
        
        • 撤销索引
        ALTER TABLE 表名称
        DROP INDEX 列名称 
        
      • PRIMARY KEY 设置主键,一个表中只能有一个主键

        • 在创建表时,末尾加上该语句

        PRIMARY KEY (列名称)

        • 表创建后添加主键
        ALTER TABLE表名称
        ADD PRIMARY KEY (列名称) 
        
        • 撤销表中的主键
        ALTER TABLE 表名称
        DROP PRIMARY KEY 
        
      • FOREIGN KEY 一个表中的 FOREIGN KEY 指向另一个表中的 PRIMARY KEY

        • 在创建表时,末尾加上该语句

        FOREIGN KEY (列名称) REFERENCES 表名称(列名称)

        • 表创建后添加FOREIGN KEY
        ALTER TABLE 表名称1
        ADD FOREIGN KEY (列名称)
        REFERENCES 表名称2(列名称)
        
        • 删除表中的PRIMARY KEY
        ALTER TABLE 表名称
        DROP FOREIGN KEY 约束名称
        
      • CHECK 限制列中的值的范围

        • 在创建表时,末尾加上该语句

        CHECK (列名称 范围限制)

        • 表创建后添加限制范围
        ALTER TABLE 表名称
        ADD CHECK (列名称 范围限制)
        
        • 撤销范围限制
        ALTER TABLE 表名称
        DROP CONSTRAINT 约束名称
        
      • DEFAULT 向列中插入默认值

        • 在创建表时,向数据后添加默认值

        列名称 数据类型 DEFALUT 默认值

      • 表创建后添加默认值

      ALTER TABLE 表名称
      ALTER 列名称 SET DEFAULT 默认值 
      
      • 删除默认值
      ALTER TABLE 表名称
      ALTER 列名称 DROP DEFAULT 
      
    • AUTO_INCREMENT 新记录插入表中时生成一个唯一的数字

      • 在创建表时,在后面添加该字段即可

      列名称 int NOT NULL AUTO_INCREMENT

      • 默认以1开始递增,但也可以通过赋值来改变初始值

      ALTER TABLE 表名称 AUTO_INCREMENT=100

      • 创建新数据是不必向该数据进行赋值,但应加上NULL,代替该数据,会自动进行赋值
# 新建一个名为person的表,定义有id,name,age,address 其中id设置为主键,并采取自增形式

import pymysql

con = pymysql.connect('localhost','root','123456')

con.select_db('test')

sql = '''CREATE TABLE person
(
id INT(255) NOT NULL PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255),
age INT(100),
address VARCHAR(255)
)
'''
with con.cursor()as cursor:
    cursor.execute(sql)

con.close()
  • CREATE INDEX 创建表中的引索

    • 用于加速搜索数据,用户无法看见,只需设置常用的列

    • 使用以下语句

    CREATE INDEX 引索名称
    ON 表名称 (列名称)
    
  • DROP 删除索引、表和数据库

    • 删除表

    DROP TABLE 表名称

    • 删除数据库

    DROP DATABASE 数据库名称

    • 删除表中数据,但保留表

    TRUNCATE TABLE 表名称

  • ALTER TABLE 在已有的表中添加、修改或删除列

    • 向表中添加列
    ALTER TABLE 表名称
    ADD 列名称 列类型  
    
    • 向表中删除列
    ALTER TABLE 表名称 
    DROP COLUMN 列名称
    
    • 更改表中某一列的数据类型
    ALTER TABLE 表名称
    ALTER COLUMN 列名称 列类型
    

数据操作语言 (DML) 包含用于更新、插入和删除记录的语法

  • SELECT 选取数据

    SELECT 列名称 FROM 表名称

  • SELECT DISTINCT 去掉重复数据

    SELECT DISTINCT 列名称 FROM 表名称

  • WHERE 有条件的选取数据

    SELECT 列名称 FROM 表名称 WHERE 列 运算符 值

    • 运算符
    =    等于
    <>  不等于
    >    大于
    <    小于
    >=  大于等于
    <=  小于等于
    
    • 操作符

      • IN 允许在 WHERE 子句中规定多个值,返回包含这些值的集合
      SELECT column_name(s)
      FROM table_name
      WHERE column_name IN (value1,value2,...)
      
      • BETWEEN 选取介于两个值之间的数据范围 左包右闭
      SELECT column_name(s)
      FROM table_name
      WHERE column_name
      BETWEEN value1 AND value2
      
    • AND 和 OR 对一个以上的条件对记录进行过滤

    SELECT * FROM 表名称 WHERE 列名称 运算符 值 AND 列名称 运算符 值

    总结: 可以将AND OR WHERE 组合起来使用,用于查找精确的数据

    • LIKE 于在 WHERE 子句中搜索列中的指定模式,类似于正则表达式

      SELECT column_name(s)
      FROM table_name
      WHERE column_name LIKE pattern
      
      • 通配符
    image
    • ORDER BY 语句用于对结果集进行排序

      • 默认顺序排序,字母以ABC形式,数字从大到小

      SELECT 列名称 FROM 表名称 ORDER BY 列名称

      • 添加DESC可变为逆序排序

      SELECT 列名称 FROM 表名称 ORDER BY 列名称 DESC

    • LIMIT 规定返回数据集合的最大值

    "SELECT column_name(s)
    FROM table_name
    LIMIT number"
    
  • INTO 从一个表中选取输出并复制到另一个表中,用于备份数据库

    • 备份到另一个数据库中
    SELECT *
    INTO new_table_name IN externaldatabase
    FROM old_tablename  
    
    • 备份到另一个表中
    "SELECT *
    INTO Persons_backup
    FROM Persons   
    
  • INSERT INTO 项数据库添加新行

    • 向一行中添加数据

    INSERT INTO 表名称 VALUES (值1, 值2,....) 添加所有值

    • 向一行中选取的列中添加数据

    INSERT INTO 表名称 (列1, 列2,...) VALUES (值1, 值2,....)

  • UPDATE 修改表中的数据

    • 修改某列数据为某值的数据为新值

    UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值

    • 向某行中的多列修改数据

    UPDATE 表名称 SET 列名称1 = 新值1,列名称2 = 新值2,…. WHERE 列名称 = 某值

  • DELETE 删除表中的行

    • 删除列名称为某值的所有行

    DELETE FROM 表名称 WHERE 列名称 = 值

    • 删除所有行,即清空所有数据

    DELETE * FROM table_name

向数据库的person表中写入一行数据
import pymysql

con = pymysql.connect('localhost','root','123456')

con.select_db('test')

sql = ''' INSERT INTO person VALUES(NULL,'jack',18,'Beijing')
'''
with con.cursor()as cursor:
    cursor.execute(sql)

con.commit()
con.close()
写入多行数据
import pymysql

con = pymysql.connect('localhost','root','123456')

con.select_db('test')

list = [(None,'jack',18,'beijing'),(None,'bob',20,'shanghai'),(None,'alice',10,'beijing'),(None,'luna',18,'shengzheng')]

with con.cursor()as cursor:
    cursor.executemany('INSERT INTO person VALUES(%s,%s,%s,%s)',list)

con.commit()

con.close()
查找所有数据
import pymysql

con = pymysql.connect('localhost','root','123456')

con.select_db('test')

sql = 'SELECT * FROM person'

with con.cursor()as cursor:
    cursor.execute(sql)
    data = cursor.fetchall()
    for i in data:
        print(i)

con.close()
查找所有地址为beijing的数据
import pymysql

con = pymysql.connect('localhost','root','123456')

con.select_db('test')

sql = "SELECT * FROM person where address = 'beijing'"

with con.cursor()as cursor:
    cursor.execute(sql)
    data = cursor.fetchall()
    for i in data:
        print(i)

con.close()
查找所有age大于10的数据
import pymysql

con = pymysql.connect('localhost','root','123456')

con.select_db('test')

sql = "SELECT * FROM person where age > 10"

with con.cursor()as cursor:
    cursor.execute(sql)
    data = cursor.fetchall()
    for i in data:
        print(i)

con.close()
查找age大于10并且address等于bejing的数据
import pymysql

con = pymysql.connect('localhost','root','123456')

con.select_db('test')

sql = "SELECT * FROM person where age > 10 AND address = 'beijing'"

with con.cursor()as cursor:
    cursor.execute(sql)
    data = cursor.fetchall()
    for i in data:
        print(i)

con.close()
将所有数据按年龄大小进行逆序排序
import pymysql

con = pymysql.connect('localhost','root','123456')

con.select_db('test')

sql = "SELECT * FROM person ORDER BY age DESC"

with con.cursor()as cursor:
    cursor.execute(sql)
    data = cursor.fetchall()
    for i in data:
        print(i)

con.close()
修改表中jack的age为16
import pymysql

con = pymysql.connect('localhost','root','123456')

con.select_db('test')

sql = "UPDATE person set age = 16 WHERE name = 'jack'"

with con.cursor()as cursor:
    cursor.execute(sql)

con.commit()

con.close()
删除数据库中jack的数据
import pymysql

con = pymysql.connect('localhost','root','123456')

con.select_db('test')

sql = "DELETE FROM person WHERE name = 'jack'"

with con.cursor()as cursor:
    cursor.execute(sql)

con.commit()

con.close()
删除表中所有数据
import pymysql

con = pymysql.connect('localhost','root','123456')

con.select_db('test')

sql = "DELETE FROM person"

with con.cursor()as cursor:
    cursor.execute(sql)

con.commit()

con.close()
向表中添加sex列,类型为varchar
import pymysql

con = pymysql.connect('localhost','root','123456')

con.select_db('test')

sql = '''ALTER TABLE person
ADD sex VARCHAR(255)
'''

with con.cursor()as cursor:
    cursor.execute(sql)

con.commit()

con.close()
删除表
import pymysql

con = pymysql.connect('localhost','root','123456')

con.select_db('test')

sql = '''DROP TABLE person
'''

with con.cursor()as cursor:
    cursor.execute(sql)

con.commit()

con.close()
删除数据库
import pymysql

con = pymysql.connect('localhost','root','123456')

sql = '''DROP DATABASE test
'''

with con.cursor()as cursor:
    cursor.execute(sql)

con.commit()

con.close()
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,646评论 4 366
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,979评论 1 301
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,391评论 0 250
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,356评论 0 215
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,740评论 3 293
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,836评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,022评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,764评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,487评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,728评论 2 252
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,200评论 1 263
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,548评论 3 260
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,217评论 3 241
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,134评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,921评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,919评论 2 283
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,766评论 2 274

推荐阅读更多精彩内容