当前位置: 移动技术网 > IT编程>脚本编程>Python > python操作mysql

python操作mysql

2018年03月25日  | 移动技术网IT编程  | 我要评论

猪肉行情,马云视频,判官笔

我的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

 

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网