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