zoukankan      html  css  js  c++  java
  • 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

    Flask 的 Context 机制 https://blog.tonyseek.com/post/the-context-mechanism-of-flask/

  • 相关阅读:
    腰围2尺1,2,3,4,5,6,7,8寸各自等于是多少厘米/英寸(对比表)
    MySQL Server 5.0 下载与 安装指南[图文] (安装到非系统路径+设置root账号相应password)
    UISearchDisplayController UISearchBar
    第八届蓝桥杯JavaB组省赛真题
    第八届蓝桥杯JavaA组省赛真题
    第八届蓝桥杯JavaA组省赛真题
    第八届蓝桥杯JavaA组省赛真题
    第八届蓝桥杯JavaA组省赛真题
    第八届蓝桥杯JavaA组省赛真题
    第七届蓝桥杯JavaC组省赛真题
  • 原文地址:https://www.cnblogs.com/rgcLOVEyaya/p/RGC_LOVE_YAYA_382days.html
Copyright © 2011-2022 走看看