欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

python操作mysql

程序员文章站 2022-05-04 14:59:35
我的python版本( 2.7 ) 需要安装python mysql驱动 sudo pip install MySQL-python 如果报错,找不到mysql_config: sudo ln -s /usr/local/mysql57/bin/mysql_config /usr/local/bin ......

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