mysql数据库表字段替换问题之python解决办法(后来直接用了sql解决,其中py程序有个小问题暂时还没解决)

来源:互联网 发布:星战 知乎 编辑:程序博客网 时间:2024/04/29 16:59

本篇会提供两种解决方案,当然py部分,可能比较麻烦。不过,我想这个部分今后也会使用到,所以还是贴出来留个纪念,以鼓励后人。对于长期性能监控来说,使用shell进行自动话性能监控,只是我对游戏自动化构想的第一步。而既然现在,可以产生如此多的数据,如何更为高效的管理和分析这些数据应该下个阶段需要着重讨论的问题。本篇后,本人也会花更多经历在这个方面进行研究,欢迎高手指证,嘿嘿!

以下提供Py部分解决方案:

 

# -*- coding: cp936 -*-
#
需求:批量替换Mysql两表的数据,如:A、B两表分别都包含a、b、c三个字段,我们需要替换A表中的B字段
    #为B表中的C字段。由此,写了以下这个麻烦的替换程序,生成新表C
import MySQLdb

global conn,cursor0,cursor1,cursor2,cursor3,id_values,name_values

#数据连接
def Mysql_conn():
    
    
global conn,cursor0,cursor1,cursor2,cursor3
    host 
= "localhost"
    user 
= "root"
    passwd 
= "123456"
    dbname 
= "test"
    
try:
        conn 
= MySQLdb.connect(host,
                               user,
                               passwd,
                               dbname)
        cursor0 
= conn.cursor()
        cursor1 
= conn.cursor()
        cursor2 
= conn.cursor()
        cursor3 
= conn.cursor()
        
        
#Mysql_conn_test()
        
        
return cursor0,cursor1,cursor2,cursor3,conn
        
    
except MySQLdb.Error,e:
        
print "Error %d: %s" %(e.args[0],e.args[1])

#数据库连接测试,得到当前数据版本
def Mysql_conn_test():
    
    Mysql_conn()
    cursor0.execute(
"select version()")
    
print "数据版本%s" % cursor.fetchone()[0]

#测试数据库插入方法
def Mysql_insert_test():
    Print_params(
"测试")
    Mysql_conn()
    Print_params(
"测试")
    
#cursor0.execute("insert into test000(name) values ('123')")
    cursor0.execute("insert into test000(id,name) values('','123');")
    
print "数据版本%s" % cursor.fetchone()[0]
    Print_params(
"数据插入成功!")
    cursor0.close()

#数据库替换方法
def Mysql_task():
    
    
global conn,cursor0,cursor1,cursor2,cursor3,id_values,name_values
    
#初始化列表
    instead_list_000 = []
    instead_list_001 
= []
    num 
= 0
    
    
#从两张表中得到数据 
    Mysql_conn()
    
    cursor0.execute(
"select * from test000")
    cursor1.execute(
"select * from test001")
    
    row000 
= cursor0.fetchall()
    row001 
= cursor1.fetchall()
    
    
#读出两张表的数据,替换其类型tuple->list
    row000 = list(row000)
    row001 
= list(row001)

    
#测试
    #Print_params(row001[0][0])
    
    
#使用第一张表的数据行数进行循环,控制替换数据的行数
    for i in range(len(row001)):
        
        
try:
            
#取出第一张表的每一行数据,生成一个完整的数组
            instead_list_000.append(row000[i])
            
#取出第二张表的每一行数据,生成一个完整的数组
            instead_list_001.append(row001[i])
        
        
except KeyError:
            num 
+= 1
            
print 'no elem %d' % num

    
#测试数据,打印生成的完整数组
    Print_params(instead_list_000)
    Print_params(instead_list_001)
            
    
#重新定义一张新表
    cursor2.execute("""
                    DROP TABLE IF EXISTS `test002`;
                    CREATE TABLE `test002` (
                    `id` int(11) NOT NULL auto_increment,
                    `name` int(11) default NULL,
                    PRIMARY KEY  (`id`)
                    ) ENGINE=InnoDB DEFAULT CHARSET=gbk;
                    
""")

    
#从生成新数组,instead_list_000,instead_list_001中读取元素,插入新数据库
    
    
for i in range(len(instead_list_000)):
        
        
#测试数据,循环读取第一个字段id,values
        #Print_params(instead_list_000[i][0])

        
#插入数据库前,进行字符转换list->str
        id_values = str(instead_list_000[i][0])
        name_values 
= str(instead_list_001[i][1])

        
#测试插入数据
        Print_params(id_values)
        Print_params(name_values)

        
#替换两表数值,插入新数据库
        #cursor2.execute("insert into test.test002 values(%s,%s)" % (id_values,name_values))
        #cursor2.nextset()
        cursor0.execute("insert into test.test000 (id,name) values('9','9')")
    
    
#关闭数据库
    Mysql_close(cursor0,cursor1)


#测试方法,打印变量的值
def Print_params(data):
    
    
print "Params 's value =",data
    

#测试方法,输出到*.txt的值
def OutPrint_txt(data):
    
    path 
= "D:CodeSourcesDev_Pydata.txt"
    out_list 
= open(path,'w')
    out_list.writelines(data)
    
return out_list

#测试方法,检查数据返回类型
def Type(type_params):
    
    
print "type:",type(type_params)
    
#关闭数据库
def Mysql_close(a,b):
    
    a.close()
    b.close()
    conn.close()
    
print "数据库更新成功,连接已关闭"

if __name__ == "__main__":
    
#Mysql_task()
    Mysql_insert_test

 另一个办法,使用sql:

  • 建议一张新表:(这里,数据库的方式选的InnoDB,详细可以查看MysalAdministrator)
DROP TABLE IF EXISTS `test_robot_data`;
CREATE TABLE  `test_robot_data` (
  `tt 
char(32NOT NULL,
  `tt1 
char(32NOT NULL,
  `tt2` 
char(32NOT NULL,
  
PRIMARY KEY  (`tt`)
) ENGINE
=InnoDB DEFAULT CHARSET=gbk;
  • 筛选前15000条数据,导入新的表,当然也可以用between
insert into temp_dianxinyi.test_robot_data SELECT * FROM temp_dianxinyi.roledata limit 15000;
  • 替换某字段的数据,这里使用了concat
update test_robot_data set AccountName=concat('robot',right(concat('0000',id),4) )
  • 在Linux下使用mysqldump备份,某库某表
/mysql/bin/mysqldump --hex-blob --single-transaction --quick -uroot -p123456  Schema TableNmae(可以为多个)  > 倒出的Linux路径 $FILEPATH/DX1/1_$i/$DATE.sql
原创粉丝点击