zoukankan      html  css  js  c++  java
  • python连接mysql数据库(MySQL)

    在介绍python在数据库中的操作之前先简单介绍点mysql中的操作语言:

    [root@elk-server 2018-01-24]# mysql -u root -p
    Enter password: 
    Welcome to the MySQL monitor.  Commands end with ; or g.
    Your MySQL connection id is 194
    Server version: 5.6.16 Source distribution
    
    Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
    
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    
    Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.
    
    mysql> show databses;
    mysql> create table users(id int(2) not null primary key auto_increment,username varchar(40),password
    mysql > desc users;
    mysql > select * from users;
    mysql > insert into users(username,password,email) values("tiantian","tiange1003","tiantianml@outlook.
    mysql > insert into users(username,password,email) values("zhiping","zhiping","785298065@qq.com");
    mysql > select * from users;
    View Code

    安装python模块:

    yum -y install python-MySQLdb

    交互模式下操作数据库:

    >>> import MySQLdb
    >>> conn = MySQLdb.connect(host="localhost",user="root",passwd="tiange1003",db="tian",port=3306,charset="utf8",unix_socket='/tmp/mysql.sock')

    逐个解释上述命令的含义:
    host:等号的后面应该填写mysql数据库的地址,因为就数据库就在本机上(也称作本地),所以使用localhost,注意引号。如果在其他的服务器上,这里应该填写ip地址,一般中小型的网站,数据库和程序都是在同一台服务器(计算机)上,就使用lcalhost了
    user:登录数据库的用户名,这里一般填写“root”,还是要注意引号。当然,如果是比较大型的服务,数据库会提供不同的用户,那时候可以更改为相应用户。但是,不同用户的权限可能不同,所以,在程序中,如果要操作数据库,还要注意所拥有的权限。在这里用root,就放心了,什么权限都有啦。不过,这样做,在大型系统中是应该避免的。
    passwd:上述user账户对应的登录mysql的密码。我在上面的粒子中用的密码是"tiange1003",不要忘记引号
    db:就是刚刚通过create命令建立的数据库,我建立的数据库名字是"tian",还是要注意引号。看管如果建立的数据库名字不是这个,就写自己所建数据库的名字
    port:一般情况,mysql的默认端口是3306,当mysql被安装到服务器之后,为了能够允许网络访问,服务器要提供一个访问端口给他
    charset:这个设置,在很多教程中都不写,如果在真正进行数据存储的时候,发现有乱码。这里我将tian这个数据库的编码设置为utf-8格式,这样就允许存入汉字而无乱码了。注意,在mysql设置中,utf-8写成utf8,没有中间的横线。但是在python文件开头和其他地方设置编码格式的时候,要写成utd-8,切记。

    注:connect中的host、user、passwd等都可以不写,只有在写的时候按照host、user、passwd、db(可以不写)、port顺序写就可以,注意端口号port=3306还是不要省略的为好,如果没有db在port前面,直接写3306回报错。

    就数据库而言,连接之后就要对其操作,但是,目前那个名字叫tian的数据库仅仅是个空架子,没有什么可操作的,要操作它,就必须在里面建立“表”,什么是数据库的表呢?
    在关系型数据库中,数据库表示一系列二维数组的集合,用来代表和存储数据对象之间的关系。它由纵向的列和横向的行组成,例如一个有关坐着信息的名为authors的表中,每个列包含的是所有坐着的摩尔个特定类型的信息,比如“姓氏”,而每行则包含了某个特定作者的所有信息:姓、名、住址等等
    对于特定的数据库表,列的数目一般事先先固定,各列之间可以由列名来识别。而行的数目可以随时,动态变化,每行通常都可以根据某个(或者几个)列中的数据来识别,成为候选键

     建立数据库并插入数据:

        mysql> use tian;
        Database changed
        mysql> show tables;
        Empty set (0.00 sec)
        用show tables命令显示这个数据中是否有数据表了。查询结果显示为空
        mysql> create table users(id int(2) not null primary key auto_increment,username varchar(40),password text,email text)default charset=utf8;
        Query OK, 0 rows affected (0.02 sec)
        建立的这个数据表名称是:users,其中包含上述字段,可以用下面的方式看一看这个数据表的结构。
        mysql> show tables;
        +----------------+
        | Tables_in_tian |
        +----------------+
        | users          |
        +----------------+
        1 row in set (0.00 sec)
    
        mysql> desc users;
        +----------+-------------+------+-----+---------+----------------+
        | Field    | Type        | Null | Key | Default | Extra          |
        +----------+-------------+------+-----+---------+----------------+
        | id       | int(2)      | NO   | PRI | NULL    | auto_increment |
        | username | varchar(40) | YES  |     | NULL    |                |
        | password | text        | YES  |     | NULL    |                |
        | email    | text        | YES  |     | NULL    |                |
        +----------+-------------+------+-----+---------+----------------+
        4 rows in set (0.00 sec)
        显示表users的结构:
        id:每增加一个用户,id号自动增加一个
        username“存储用户名,类型是varchar(40)
        password:存储用户密码,类型是text
        email:存储用户的邮箱,类型是text
    
        这个结构和上面所期望的结构是一样的,只不过这个表中还没有任何数据,
        是一个空表,可以查询一下看看:
        mysql> select * from users;
        Empty set (0.00 sec)
    
        目前表示空的,为了能够在后面用python操作这个数据表,需要向里面插入点信息:
        mysql> insert into users(username,password,email) 
        values("tiantian","tiange1003","tiantianml@outlook.com");
        Query OK, 1 row affected (0.00 sec)
    
        mysql> select * from users;
        +----+----------+------------+------------------------+
        | id | username | password   | email                  |
        +----+----------+------------+------------------------+
        |  1 | tiantian | tiange1003 | tiantianml@outlook.com |
        +----+----------+------------+------------------------+
        1 row in set (0.00 sec)

    到目前为止,在mysql中的工作已经完成,接下来就是用python操作了:

    >>> import MySQLdb
    >>> conn = MySQLdb.connect(host="localhost",user="root",passwd="tiange1003",db="tian",port=3306,charset="utf8",unix_socket='/tmp/mysql.sock')
    >>> cur = conn.cursor()
    >>> cur.execute("insert into users(username,password,email) values (%s,%s,%s)",("chenchen","chenchen","12345678@qq.com"))
    >>> conn.commit()

    上面是python交互模式下的连接,完成连接的过程,其实是建立一个MySQLdb.connect()的实例对象conn,那么这个对象有哪些属性
    commit():如果数据库表进行了修改,提交保存当前的数据。当然,如果此用户没有权限就作罢了,什么都不会发生
    rollback():没有权限,就取消当前的操作,否则报错
    curso():游标指针
    连接成功之后,开始操作。注意:MySQLdb用游标(指针)cursor的方式操作数据库,就是这样:
    >>> cur = conn.cursor()
    因改模块底层其实是调用CAPS的,所以,需要先得到当前指向数据库的指针,这也就是提醒我们,在操作数据库的时候,指针会移动,如果移动到数据最后一条,再查,就查不出来什么来了。

    cursor执行命令的方法:

    execute(query,srgs):执行单条sql语句。query为sql语句本身,srgs为参数值的列表。执行后返回值为受影响的行数

    executemany(query,args):执行单条sql语句,但是重复执行参数列表里的参数,返回值为受影响的行数

    >>> cur.execute("insert into users(username,password,email) values (%s,%s,%s)",("chenchen","chenchen","12345678@qq.com"))
    1L

    没有报错,并且返回一个"1L"结果,说明有一行记录操作成功。可以去mysql里面使用sql语言查看,但是查看的时候并没有显示成功,这里的原因是通过"cur.execute()"对数据库进行操作之后,没有报错,完全正确,但是不等于数据就已经提交到数据库中,还必须要用到"Mysql.connect"的一个属性:commit(),将数据提交上去,也及时进行了"cur.execute()"操作,要讲数据提交,必须执行:

    >>> conn.commit()

    然后再去mysql里面使用sql语言查询的时候,会出现下面的效果:

    mysql> select * from users;
    +----+----------+------------+------------------------+
    | id | username | password | email |
    +----+----------+------------+------------------------+
    | 1 | tiantian | tiange1003 | tiantianml@outlook.com |
    | 2 | zhiping | zhiping | 785298065@qq.com |
    | 3 | chenchen | chenchen | 12345678@qq.com |
    +----+----------+------------+------------------------+
    3 rows in set (0.00 sec)

    再尝试一下插入多条的那个命令"executemany(query,args)"

    >>> cur.executemany("insert into users (username,password,email) values (%s,%s,%s)",(("google","111222","g@gmail.com"),("facebook","222333","f@face.book"),("github","333444","git@hub.com"),("docker","444555","doc@ker.com")))
    4L

    接着在mysql中使用sql语言继续查询:

    mysql> select * from users;
    +----+----------+------------+------------------------+
    | id | username | password | email |
    +----+----------+------------+------------------------+
    | 1 | tiantian | tiange1003 | tiantianml@outlook.com |
    | 2 | zhiping | zhiping | 785298065@qq.com |
    | 3 | chenchen | chenchen | 12345678@qq.com |
    | 4 | google | 111222 | g@gmail.com |
    | 5 | facebook | 222333 | f@face.book |
    | 6 | github | 333444 | git@hub.com |
    | 7 | docker | 444555 | doc@ker.com |
    +----+----------+------------+------------------------+
    7 rows in set (0.00 sec)

    成功插入了多条记录。也别需要注意的是,在“exectemany(query,args)”中,query还是一条sql语句,但是args这时候是一个tuplie,这个tuple里面的元素也是tuple,每个tuple分别对应sql语句中的字段列表。这句话其实被执行多次。只不过执行过程不显示给我们看罢了。

  • 相关阅读:
    js正则表达式中的问号使用技巧总结
    380. Insert Delete GetRandom O(1)
    34. Find First and Last Position of Element in Sorted Array
    162. Find Peak Element
    220. Contains Duplicate III
    269. Alien Dictionary
    18. 4Sum
    15. 3Sum
    224. Basic Calculator
    227. Basic Calculator II
  • 原文地址:https://www.cnblogs.com/1111zhiping-tian/p/8361913.html
Copyright © 2011-2022 走看看