最近项目的两次版本迭代中,根据业务需求的变化,需要对数据库进行更新,两次分别使用了不同的方式进行更新。
第一种:使用python的MySQLdb模块利用原生的sql语句进行更新
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
import MySQLdb #主机名 HOST = '127.0.0.1' #用户名 USER = "root" #密码 PASSWD = "123456" #数据库名 DB = "db_name" # 打开数据库连接 db = MySQLdb.connect(HOST,USER,PASSWD,DB) # 获取操作游标 cursor = db.cursor() if __name__ = = '__main__' : if cursor: command_a = "update tables_one set status=5 where status=0" # 使用execute方法执行SQL语句 cursor.execute(command_a) # 提交到数据库执行 db.commit() command2 = "select field from tables_one where id =12" ret2 = cursor.execute(command2) # 获取所有记录列表 ret2 = cursor.fetchall() for item in ret2: command3 = "insert into tables_two(name) values (%s);" % (item[ 0 ]) fin = cursor.execute(command3) db.commit() # 关闭数据库连接 db.close() |
数据库查询三种方式
- fetchone(): 该方法获取下一个查询结果集。结果集是一个对象
- fetchall():接收全部的返回结果行.
- rowcount: 这是一个只读属性,并返回执行execute()方法后影响的行数。
第二种:使用python的框架flask和sqlalchemy进行更新
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
# -*- coding:utf-8 -*- from flask import Flask from flask_sqlalchemy import SQLAlchemy from sqlalchemy.sql import text HOST = '127.0.0.1' USER = "root" PASSWD = "123456" DB = "carrier_test" CHARTSET = "utf8" app = Flask(__name__,instance_relative_config = True ) #链接数据库路径 app.config[ 'SQLALCHEMY_DATABASE_URI' ] = 'mysql://%s:%s@127.0.0.1:3306/%s?charset=%s' % (USER,PASSWD,DB,CHARTSET) #如果设置成 True (默认情况),Flask-SQLAlchemy 将会追踪对象的修改并且发送信号。这需要额外的内存, 如果不必要的可以禁用它。 app.config[ 'SQLALCHEMY_TRACK_MODIFICATIONS' ] = True #如果设置成 True,SQLAlchemy 将会记录所有 发到标准输出(stderr)的语句,这对调试很有帮助。 app.config[ 'SQLALCHEMY_ECHO' ] = False # 数据库连接池的大小。默认是数据库引擎的默认值 (通常是 5)。 app.config[ 'SQLALCHEMY_POOL_SIZE' ] = 6 db = SQLAlchemy(app) class Table_one(db.Model): __tablename__ = 'table_one' id = db.Column( 'id' , db.Integer, primary_key = True , autoincrement = True ) com_name = db.Column( 'com_name' , db.String( 30 ), nullable = False ) com_about = db.Column( 'com_about' , db.String( 200 ), nullable = False ) def __repr__( self ): return '<table_one com_name %r>' % self .com_name class Table_two(db.Model): __tablename__ = 'table_two' id = db.Column( 'id' , db.Integer, primary_key = True , autoincrement = True ) reason = db.Column( 'reason' , db.String( 128 ), nullable = True ) create_time = db.Column( 'create_time' , db.TIMESTAMP, server_default = text( 'now()' )) status = db.Column( 'status' , db.Integer, nullable = False , default = 0 ) def __repr__( self ): return '<table_two id %r>' % self . id def db_commit_all(lists): try : db.session.add_all(lists) db.session.commit() return 'SUCCESS' except Exception,e: return 'Fail!!!' def commits_to_three_judge(): com_sta_obj = Table_one.query.filter_by(com_name = '只是测试使用,不用关心表间关系' ). all () for ite in com_sta_obj: ship_obj = Table_two.query.filter_by( id = ite. id ).first() if ship_obj: if int (ship_obj.status) = = 2 : ite.status = 0 print db_commit_all([ite]) print '表同步结束' 64 if __name__ = = '__main__' : #执行更新数据库函数 commits_to_three_judge() |
两种方式对比:
1.在实际项目中,数据库的更新 需要用到很多相关函数进行数据的收集,判断是否满足条件等,而这些相关函数在项目中都是用 Sqlalchemy进行数据相关操作,比如第二种方法里的db_commit_all()函数
2.使用第二种方法,直接复制这些函数到脚本中即可,如果使用第一种方法,则需要重写相关函数,增加开发时间,浪费精力。
3.如果项目中是使用flask进行开发,推荐使用第二种方法进行数据库更新。
总结
以上所述是小编给大家介绍的Python更新数据库脚本两种方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!
原文链接:http://www.cnblogs.com/rgcLOVEyaya/archive/2017/07/27/RGC_LOVE_YAYA_382days.html