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 10 Python
在Python的Django框架中获取单个对象数据的简单方法
Jul 17 Python
深入讲解Python函数中参数的使用及默认参数的陷阱
Mar 13 Python
python魔法方法-属性转换和类的表示详解
Jul 22 Python
异步任务队列Celery在Django中的使用方法
Jun 07 Python
Python wxPython库使用wx.ListBox创建列表框示例
Sep 03 Python
Python图像处理之图像的读取、显示与保存操作【测试可用】
Jan 04 Python
Python参数解析模块sys、getopt、argparse使用与对比分析
Apr 02 Python
利用Python复制文件的9种方法总结
Sep 02 Python
浅析pandas 数据结构中的DataFrame
Oct 12 Python
linux 下python多线程递归复制文件夹及文件夹中的文件
Jan 02 Python
解决pyinstaller打包运行程序时出现缺少plotly库问题
Jun 02 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循环输出数据库内容的代码
2008/05/24 PHP
php 什么是PEAR?(第三篇)
2009/03/19 PHP
PHP中用Trait封装单例模式的实现
2019/12/18 PHP
js获取php变量的实现代码
2013/08/10 Javascript
基于jquery自定义的漂亮单选按钮RadioButton
2013/11/19 Javascript
JS实现双击编辑可修改状态的方法
2015/08/14 Javascript
原生JS实现的放大镜效果实例代码
2016/10/15 Javascript
详解Vue.js——60分钟组件快速入门(上篇)
2016/12/05 Javascript
jQuery实现碰到边缘反弹的动画效果
2018/02/24 jQuery
vue mint-ui tabbar变组件使用
2018/05/04 Javascript
Node.js 使用AngularJS的方法示例
2018/05/11 Javascript
js获取对象,数组所有属性键值(key)和对应值(value)的方法示例
2019/06/19 Javascript
微信公众号服务器验证Token步骤图解
2019/12/30 Javascript
js对象简介与基本用法示例
2020/03/13 Javascript
javascript+css实现进度条效果
2020/03/25 Javascript
vue 路由缓存 路由嵌套 路由守卫 监听物理返回操作
2020/08/06 Javascript
[52:37]完美世界DOTA2联赛循环赛 Forest vs DM BO2第一场 10.29
2020/10/29 DOTA
python连接mysql并提交mysql事务示例
2014/03/05 Python
python九九乘法表的实例
2017/09/26 Python
NumPy 如何生成多维数组的方法
2018/02/05 Python
python安装twisted的问题解析
2018/08/21 Python
Python 计算任意两向量之间的夹角方法
2019/07/05 Python
Python计算指定日期是今年的第几天(三种方法)
2020/03/26 Python
TensorFlow的环境配置与安装教程详解(win10+GeForce GTX1060+CUDA 9.0+cuDNN7.3+tensorflow-gpu 1.12.0+python3.5.5)
2020/06/22 Python
Python实现随机爬山算法
2021/01/29 Python
简单掌握CSS3中resize属性的用法
2016/04/01 HTML / CSS
CSS3 Flex 弹性布局实例代码详解
2018/11/01 HTML / CSS
Keds官方网站:购买帆布运动鞋和经典皮鞋
2016/11/12 全球购物
馥绿德雅美国官方网站:Rene Furterer头皮护理专家
2019/05/01 全球购物
MUGLER官方网站:蒂埃里·穆勒香水
2019/11/26 全球购物
遗嘱继承公证书
2014/04/09 职场文书
中国梦演讲稿教师篇
2014/04/23 职场文书
大学学风建设方案
2014/05/04 职场文书
文员转正自我鉴定怎么写
2014/09/29 职场文书
党员“四风”问题批评与自我批评思想汇报
2014/10/06 职场文书
2015年119消防宣传日活动总结
2015/03/24 职场文书