Python-Flask:动态创建表的示例详解


Posted in Python onNovember 22, 2019

今天小编从项目的实际出发,由于项目某一个表的数据达到好几十万条,此时数据的增删查改会很慢;为了增加提高访问的速度,我们引入动态创建表。

代码如下:

from app_factory import app
from sqlalchemy import Column, String, Integer
 
class ProjectModel(app.db.model, app.db.Mixin):
 
  tablename = 'Project_'
 
  ID = Column(String(50), name='ID', doc='id')
  PROJECTNUMBER = Column(String(100), name='PROJECTNUMBER', doc='项目编号')
  ......
 
 
  @staticmethod
  def create_table(project_number)
    table_name = ProjectModel.tablename + projectnumber
    structs = [
      {'fieldname': 'id', 'type': 'varchar2(50)', 'primary': True, 'default': ''},
      {'fieldname': 'PROJECTNUMBER', 'type': 'varchar2(50)', 'default': 0, 'isnull':         
        True},
      .......
    ]
    app.db.create_table(table_name, structs)

那么,内层函数是如何创建的呢?其实就是拼接sql语句create table ....

代码如下:

class SQLAlchemyDB(SQLAlchemy):
  def __init__(self, app)
    super(SQLAlchemyDB, self).__init__(app)
    self.__app = app
    self.engine.echo = False
    self.conn = self.engine.connect()
    self.Model.to_dict() = lambda self:{c.name:getattr(self, c.name, None) for c in self.__table__.columns}
    self.Session = sessionmaker(bind=self.engine)
    self.ScopedSession = lambda: scoped_session(self.Session)
 
  # 释放碎片空间
  def free_idle_space(self):
    return self.execute('purge recyclebin')
  
  def connstatus(self):
    return self.engine.pool.status()
  
  def close(self):
    self.conn.close()
    self.engine.dispose()
 
  # 非返回数据的记录语句
  def execute(self, sqlexpr)
    try:
      ret = self.conn.execute(sqlalchemy.text(sqlexpr))
    except Exception as err:
      return False, str(err)
    except sqlalchemy.exc.InvalidRequestError as err:
      return False, str(err)
 
    return True, ''
 
  # 动态拼接sql语句, 创建表
  def create_table(self, tablename, structs):
    fieldinfos = []
    for struct in structs:
      defaultvalue = struct.get('default')
      if defaultvalue :
        defaultvalue = "'{0}'".format(defaultvalue) if type(defaultvalue) == 'str' else str(defaultvalue)
      fieldinfos.append('{0} {1} {2} {3} {4}'.format(struct['fieldname'], struct['type'], 'primary key' if struct.get('primary') else '', ('default' + defaultvalue) if defaultvalue else '', '' if struct.get('isnull') else 'not null'))
    sql = 'create table {0} ({1})'.format(tablename, ','.join(fieldinfos))
    ret, err = self.execute(sql)
    if ret:
      self.__app.sync_record(tablename, 'sql_createtable', {}, sql)
    return ret, err
 
  # 动态判断表是否存在 
  def existtable(self, tablename):
    ret, err = self.GetRecordCount("user_all_table", "TABLE_NAME='" + tablename +"'")
    return ret>0, err
  
  def GetRecordCount(self, tablename, where= None):
    sql = 'select count(*) as num from {0} {1}'.format(tablename,('where' + where)) if where != None else '')
    recs, err = self.query(sql)
    if recs:
      for rec in recs:
        return rec['num'], '' 
    return -1 , err
  
  # 查询数据记录
  def query(self, sqlexpr):
    try:
      recs = self.conn.execute(sqlalchemy.text(sqlexpr)
      return recs, ''
    expect Exception as err:
      return None, str(err)  
    expect sqlalchemy.exc.InvalidRequestError as err:
      return None, str(err)

那么,类似的:

1-如果动态的对已经创建的表格进行增删查改,那么可以用类似的思想,进行对sql语句进行拼接,insert select delete update

2-判断是否存在此字段,进去拼接查询这个字段查出的数据是否为空(count)

3-在原来表的基础上增加字段,或者修改字段,用alter

以上这篇Python-Flask:动态创建表的示例详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python中bisect模块用法实例
Sep 25 Python
深入理解python函数递归和生成器
Jun 06 Python
利用python实现简单的循环购物车功能示例代码
Jul 05 Python
Python 获取当前所在目录的方法详解
Aug 02 Python
Python用户推荐系统曼哈顿算法实现完整代码
Dec 01 Python
Python编写一个优美的下载器
Apr 15 Python
Python实现计算圆周率π的值到任意位的方法示例
May 08 Python
Python基础教程之异常详解
Jan 10 Python
自定义Django默认的sitemap站点地图样式
Mar 04 Python
python爬取抖音视频的实例分析
Jan 19 Python
python设置 matplotlib 正确显示中文的四种方式
May 10 Python
详细介绍python类及类的用法
May 31 Python
python flask中动态URL规则详解
Nov 22 #Python
Python之——生成动态路由轨迹图的实例
Nov 22 #Python
python:动态路由的Flask程序代码
Nov 22 #Python
python判断无向图环是否存在的示例
Nov 22 #Python
python计算无向图节点度的实例代码
Nov 22 #Python
Python字符串格式化输出代码实例
Nov 22 #Python
python常用数据重复项处理方法
Nov 22 #Python
You might like
PHP和JavaScrip分别获取关联数组的键值示例代码
2013/09/16 PHP
PHP的Socket通信之UDP通信实例
2015/07/02 PHP
简单谈谈PHP vs Node.js
2015/07/17 PHP
PHP模板引擎Smarty之配置文件在模板变量中的使用方法示例
2016/04/11 PHP
详细介绍jQuery.outerWidth() 函数具体用法
2015/07/20 Javascript
jQuery实现一个简单的轮播图
2017/02/19 Javascript
轻松学习Javascript闭包
2017/03/01 Javascript
angular4 如何在全局设置路由跳转动画的方法
2017/08/30 Javascript
AngularJS动态添加数据并删除的实例
2018/02/27 Javascript
详解node.js 下载图片的 2 种方式
2018/03/02 Javascript
video.js 一个页面同时播放多个视频的实例代码
2018/11/27 Javascript
vue移动端城市三级联动组件使用详解
2019/07/26 Javascript
让Vue响应Map或Set的变化操作
2020/11/11 Javascript
vue-cli 3如何使用vue-bootstrap-datetimepicker日期插件
2021/02/20 Vue.js
Python实现拼接多张图片的方法
2014/12/01 Python
python实现批量下载新浪博客的方法
2015/06/15 Python
Python文件读写保存操作的示例代码
2018/09/14 Python
IntelliJ IDEA安装运行python插件方法
2018/12/10 Python
python读写csv文件并增加行列的实例代码
2019/08/01 Python
详解用python生成随机数的几种方法
2019/08/04 Python
使用Python操作ArangoDB的方法步骤
2020/02/02 Python
浅谈keras使用中val_acc和acc值不同步的思考
2020/06/18 Python
解析Tensorflow之MNIST的使用
2020/06/30 Python
django美化后台django-suit的安装配置操作
2020/07/12 Python
详解canvas绘制网络字体几种方法
2019/08/27 HTML / CSS
公司庆典活动邀请函
2014/01/09 职场文书
简历中自我评价怎么写
2014/02/12 职场文书
学习决心书
2014/03/11 职场文书
周年庆促销方案
2014/03/15 职场文书
构建和谐校园倡议书
2015/01/19 职场文书
工作失误检讨书
2015/01/26 职场文书
高考诚信考试承诺书
2015/04/29 职场文书
投标单位介绍信
2015/05/05 职场文书
母亲节主题班会
2015/08/14 职场文书
远程教育集中轮训基层干部培训班学习心得体会
2016/01/09 职场文书
MySQL读取JSON转换的方式
2022/03/18 MySQL