zoukankan      html  css  js  c++  java
  • python操作mysql

    我的python版本( 2.7 )

    需要安装python mysql驱动

    sudo pip install MySQL-python

    如果报错,找不到mysql_config:

    sudo ln -s /usr/local/mysql57/bin/mysql_config /usr/local/bin/mysql_config

    这里自己根据实际情况,建立一个软连接,驱动就能够找到mysql_config,因为我mysql装在/usr/local/mysql57下面

    如果报错,找不到libmysqlclient.so.20,同样建立一个对应的软连接( 请根据自己电脑的实际情况在相应的目录建立软链接 )

    sudo ln -s /usr/local/mysql57/lib/libmysqlclient.so.20 /usr/lib/libmysqlclient.so.20

    python mysql操作流程:

    开始->创建连接对象( connection )->获取游标对象cursor->执行select语句(cursor.execute() )->使用cursor.fetch*( fetchone,fetchall,fetchmany )获取并处理数据->关闭cursor->关闭connect

    ->结束

    mysql> select * from user_info;
    +---------+-----------+
    | user_id | user_name |
    +---------+-----------+
    |       1 | ghostwu   |
    |       2 | zhangsan  |
    |       3 | zhangsan  |
    |       4 | zhangsan  |
    +---------+-----------+
    4 rows in set (0.00 sec)
    
    mysql> 
     1 #!/usr/bin/python
     2 #coding:utf-8
     3 
     4 import MySQLdb
     5 
     6 conn = MySQLdb.Connect(
     7            host = '127.0.0.1',
     8            port = 3306,
     9            user = 'root',
    10            passwd = 'abc123',
    11            db = 'shop',
    12            charset = 'utf8'
    13         )
    14 
    15 cursor = conn.cursor()
    16 
    17 sql = 'select * from user_info'
    18 
    19 cursor.execute( sql )
    20 
    21 print cursor.rowcount
    22 
    23 res = cursor.fetchone()
    24 print res
    25 
    26 res = cursor.fetchmany( 2 )
    27 print res
    28 
    29 res = cursor.fetchall()
    30 print res
    31 
    32 cursor.close()
    33 conn.close()

    当数据量比较小的时候,可以一次性读取出来,遍历fetchall的数据

     1 #!/usr/bin/python
     2 #coding:utf-8
     3 
     4 import MySQLdb
     5 
     6 conn = MySQLdb.Connect(
     7            host = '127.0.0.1',
     8            port = 3306,
     9            user = 'root',
    10            passwd = 'abc123',
    11            db = 'shop',
    12            charset = 'utf8'
    13         )
    14 
    15 cursor = conn.cursor()
    16 sql = 'select * from user_info'
    17 cursor.execute( sql )
    18 
    19 res = cursor.fetchall()
    20 for row in res:
    21     print 'userid=%s, username=%s' % row
    22 
    23 cursor.close()
    24 conn.close()

    python操作mysql增删改:

    #!/usr/bin/python
    #coding:utf-8
    
    import MySQLdb
    
    conn = MySQLdb.Connect(
               host = '127.0.0.1',
               port = 3306,
               user = 'root',
               passwd = 'abc123',
               db = 'shop',
               charset = 'utf8'
            )
    
    cursor = conn.cursor()
    
    '''
    sql_insert = "insert into user_info( user_id, user_name ) values( null, 'hello' )"
    cursor.execute( sql_insert )
    print cursor.rowcount
    '''
    
    '''
    sql_delete = "delete from user_info where user_name = 'hello'"
    cursor.execute( sql_delete )
    print cursor.rowcount
    '''
    
    sql_update = "update user_info set user_name = 'ghostwu' where user_id = 4"
    cursor.execute( sql_update )
    print cursor.rowcount
    
    cursor.close()
    conn.close()

    修改表引擎,测试事务

    alter table user_info engine = innodb
    #!/usr/bin/python
    #coding:utf-8
    
    import MySQLdb
    
    conn = MySQLdb.Connect(
               host = '127.0.0.1',
               port = 3306,
               user = 'root',
               passwd = 'abc123',
               db = 'shop',
               charset = 'utf8'
            )
    
    cursor = conn.cursor()
    
    sql_insert = "insert into user_info( user_id, user_name ) values( null, '悟空' )"
    cursor.execute( sql_insert )
    conn.commit()
    print cursor.rowcount
    
    cursor.close()
    conn.close()

    如果没有conn.commit()这条语句,执行之后,不会在mysql表中,看到新插入的记录。python mysql默认是关闭自动提交事务的

    回滚测试

    #!/usr/bin/python
    #coding:utf-8
    
    import MySQLdb
    
    conn = MySQLdb.Connect(
               host = '127.0.0.1',
               port = 3306,
               user = 'root',
               passwd = 'abc123',
               db = 'shop',
               charset = 'utf8'
            )
    
    cursor = conn.cursor()
    
    sql_insert = "insert into user_info( user_id, user_name ) values( null, '悟空' )"
    sql_insert1 = "insert into user_info( user_id, user_name ) values( null, '八戒' )"
    sql_insert2 = "insert into user_info( user_id, user_name1 ) values( null, '白龙马' )"
    
    try:
        cursor.execute( sql_insert )
        cursor.execute( sql_insert1 )
        cursor.execute( sql_insert2 )
    except Exception as e:
        print e 
        conn.rollback
    cursor.close()
    conn.close()

    使用事务处理银行转账:

    mysql> select * from account;
    +--------+-------+
    | acctid | money |
    +--------+-------+
    |      1 |   110 |
    |      2 |    10 |
    +--------+-------+
    2 rows in set (0.00 sec)
    
    mysql> show create table account G
    *************************** 1. row ***************************
           Table: account
    Create Table: CREATE TABLE `account` (
      `acctid` int(11) DEFAULT NULL COMMENT '账户id',
      `money` int(11) DEFAULT NULL COMMENT '余额'
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8
    1 row in set (0.00 sec)
    
    mysql> 
    #!/usr/bin/python
    #coding:utf-8
    
    import sys
    import MySQLdb
    
    class TransferMoney( object ):
        def __init__( self, conn ):
            self.conn = conn
    
        def check_acct_available( self, acctid ):
            cursor = self.conn.cursor()
            try:
                sql = "select * from account where acctid=%s" % acctid
                print sql
                cursor.execute( sql )
                res = cursor.fetchall()
                if len( res ) != 1:
                    raise Exception( "账号%s不存在" % acctid )
            finally:
                cursor.close()
    
        def has_enough_money( self, acctid, money ):
            cursor = self.conn.cursor()
            try:
                sql = "select * from account where acctid=%s and money > %s" % ( acctid, money )
                print sql
                cursor.execute( sql )
                res = cursor.fetchall()
                if len( res ) != 1:
                    raise Exception( "账号%s上的钱不足%s" % ( acctid, money ) )
            finally:
                cursor.close()
    
        def reduce_money( self, acctid, money ):
            cursor = self.conn.cursor()
            try:
                sql = "update account set money = money-%s where acctid = %s" % ( money, acctid )
                print sql
                cursor.execute( sql )
                if cursor.rowcount != 1:
                    raise Exception( "账号%s减款失败" % acctid )
            finally:
                cursor.close()
    
        def add_money( self, acctid, money ):
            cursor = self.conn.cursor()
            try:
                sql = "update account set money = money+%s where acctid = %s" % ( money, acctid )
                print sql
                cursor.execute( sql )
                if cursor.rowcount != 1:
                    raise Exception( "账号%s加款失败" % acctid )
            finally:
                cursor.close()
    
    
        def transfer( self, source_acctid, target_acctid, money ):
            try:
                self.check_acct_available( source_acctid )
                self.check_acct_available( target_acctid )
                self.has_enough_money( source_acctid, money )
                self.reduce_money( source_acctid, money )
                self.add_money( target_acctid, money )
                self.conn.commit()
            except Exception as e:
                self.conn.rollback()
                raise e
    
    if __name__ == "__main__":
        source_acctid = sys.argv[1]
        target_acctid = sys.argv[2]
        money = sys.argv[3]
    
        conn = MySQLdb.Connect(
               host = '127.0.0.1',
               port = 3306,
               user = 'root',
               passwd = 'abc123',
               db = 'shop',
               charset = 'utf8'
            )
        tr_money = TransferMoney( conn )
    
        try:
            tr_money.transfer( source_acctid, target_acctid, money )
        except Exception as e:
            print "转账出现问题:" + str( e )
        finally:
            conn.close()
    ghostwu@ghostwu:~/python/db$ python transfer.py 1 2 100
    select * from account where acctid=1
    select * from account where acctid=2
    select * from account where acctid=1 and money > 100
    update account set money = money-100 where acctid = 1
    update account set money = money+100 where acctid = 2
    ghostwu@ghostwu:~/python/db$ python transfer.py 1 2 100
    select * from account where acctid=1
    select * from account where acctid=2
    select * from account where acctid=1 and money > 100
    转账出现问题:账号1上的钱不足100
  • 相关阅读:
    django的第一次使用
    python操作文件要点
    MySQL作业笔记及总结
    ASP.NET MVC——学习WebAPI
    编写PHP框架,深入了解MVC运行流程
    MySql(分表、增量备份、还原)
    ASP.NET MVC——MVC过滤器
    ASP.NET MVC——MVC-路由
    ASP.NET MVC——MVC4优化
    JS判断指定按键(组合键)是否被按下
  • 原文地址:https://www.cnblogs.com/ghostwu/p/8644277.html
Copyright © 2011-2022 走看看