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 换位密码算法的实例详解
Jul 19 Python
Python爬虫抓取代理IP并检验可用性的实例
May 07 Python
Django contenttypes 框架详解(小结)
Aug 13 Python
python调用opencv实现猫脸检测功能
Jan 15 Python
python文本数据处理学习笔记详解
Jun 17 Python
Python实现时间序列可视化的方法
Aug 06 Python
Python numpy多维数组实现原理详解
Mar 10 Python
django实现日志按日期分割
May 21 Python
keras.layer.input()用法说明
Jun 16 Python
keras 指定程序在某块卡上训练实例
Jun 22 Python
python+opencv3.4.0 实现HOG+SVM行人检测的示例代码
Jan 28 Python
python读取并查看npz/npy文件数据以及数据显示方法
Apr 14 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
重量级动漫纷纷停播!唯独OVERLORD第四季正在英魂之刃继续更新
2020/05/06 日漫
php判断终端是手机还是电脑访问网站的思路及代码
2013/04/24 PHP
php 利用socket发送GET,POST请求的实例代码
2020/07/04 PHP
PHP 实现缩略图
2021/03/09 PHP
js实现iframe动态调整高度的代码
2008/01/06 Javascript
input 高级限制级用法
2009/03/26 Javascript
Jquery作者John Resig自己封装的javascript 常用函数
2009/11/09 Javascript
元素未显示设置width/height时IE中使用currentStyle获取为auto
2014/05/04 Javascript
js兼容火狐获取图片宽和高的方法
2015/05/21 Javascript
js实现简易的单数字随机抽奖(0-9)
2020/03/19 Javascript
JavaScipt中栈的实现方法
2016/02/17 Javascript
微信小程序  简单实例(阅读器)的实例开发
2016/09/29 Javascript
用AngularJS来实现监察表单按钮的禁用效果
2016/11/02 Javascript
HTML5+JS+JQuery+ECharts实现异步加载问题
2017/12/16 jQuery
webpack之devtool详解
2018/02/10 Javascript
使用Angular CLI快速创建Angular项目的一些基本概念和写法小结
2018/04/22 Javascript
小程序开发中如何使用async-await并封装公共异步请求的方法
2019/01/20 Javascript
JQuery属性操作与循环用法示例
2019/05/15 jQuery
[09:40]DAC2018 4.5 SOLO赛 MidOne vs Miracle
2018/04/06 DOTA
[49:05]Newbee vs TNC 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
python复制文件代码实现
2013/12/23 Python
Python读写Redis数据库操作示例
2014/03/18 Python
Python程序员鲜为人知但你应该知道的17个问题
2014/06/04 Python
用matplotlib画等高线图详解
2017/12/14 Python
TensorFlow搭建神经网络最佳实践
2018/03/09 Python
Python 机器学习库 NumPy入门教程
2018/04/19 Python
python 文本单词提取和词频统计的实例
2018/12/22 Python
Django高级编程之自定义Field实现多语言
2019/07/02 Python
Python使用selenium + headless chrome获取网页内容的方法示例
2019/10/16 Python
Python调用百度OCR实现图片文字识别的示例代码
2020/07/17 Python
2014中考励志标语
2014/06/05 职场文书
教师求职信
2014/06/17 职场文书
体育教育毕业生自荐信
2014/06/29 职场文书
高中生打架检讨书1000字
2015/02/17 职场文书
安全学习心得体会范文
2016/01/18 职场文书
Python实战之OpenCV实现猫脸检测
2021/06/26 Python