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中logging模块的用法实例
Sep 29 Python
Python六大开源框架对比
Oct 19 Python
浅谈python中的正则表达式(re模块)
Oct 17 Python
解决python大批量读写.doc文件的问题
May 08 Python
python3使用smtplib实现发送邮件功能
May 22 Python
pandas ix &iloc &loc的区别
Jan 10 Python
python中PS 图像调整算法原理之亮度调整
Jun 28 Python
浅谈Python3 numpy.ptp()最大值与最小值的差
Aug 24 Python
Django调用百度AI接口实现人脸注册登录代码实例
Apr 23 Python
python实现逻辑回归的示例
Oct 09 Python
python实现登录与注册系统
Nov 30 Python
OpenCV-Python实现人脸美白算法的实例
Jun 11 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漏洞之跨网站请求伪造与防止伪造方法
2013/08/15 PHP
php+redis在实际项目中HTTP 500: Internal Server Error故障排除
2017/02/05 PHP
一个实用的php验证码类
2017/07/06 PHP
JS 显示当前日期与时间的代码
2010/03/24 Javascript
解决火狐浏览器下JS setTimeout函数不兼容失效不执行的方法
2012/11/14 Javascript
JS控制图片翻转示例代码(兼容firefox,ie,chrome)
2013/12/19 Javascript
js实现按钮控制图片360度翻转特效的方法
2015/02/17 Javascript
深入理解JavaScript中的对象
2015/06/04 Javascript
ECMAScript6中Map/WeakMap详解
2015/06/12 Javascript
使用AngularJS编写较为优美的JavaScript代码指南
2015/06/19 Javascript
javascript中去除数组重复元素的实现方法【实例】
2016/04/12 Javascript
JS 实现导航菜单中的二级下拉菜单的几种方式
2016/10/31 Javascript
bootstrap基础知识学习笔记
2016/11/02 Javascript
bootstrap css样式之表单
2017/01/19 Javascript
Django使用多数据库的方法
2017/09/06 Javascript
微信小程序实现美团菜单
2018/06/06 Javascript
如何在vue里面优雅的解决跨域(路由冲突问题)
2019/01/20 Javascript
小程序根据手机机型设置自定义底部导航距离
2019/06/04 Javascript
js实现拾色器插件(ColorPicker)
2020/05/21 Javascript
vue组件实现移动端九宫格转盘抽奖
2020/10/16 Javascript
对python过滤器和lambda函数的用法详解
2019/01/21 Python
Python开发网站目录扫描器的实现
2019/02/21 Python
Django 对IP访问频率进行限制的例子
2019/08/30 Python
Ray-Ban雷朋美国官网:全球领先的太阳眼镜品牌
2016/07/20 全球购物
中国第一家杂志折扣订阅网:杂志铺
2016/08/30 全球购物
MAC彩妆澳洲官网:M·A·C AU
2021/01/17 全球购物
大学毕业通用个人的求职信
2013/12/08 职场文书
中学生自我评价范文
2014/02/08 职场文书
班级活动总结格式
2014/08/30 职场文书
出售房屋委托书范本
2014/09/24 职场文书
财务工作失误检讨书
2015/02/19 职场文书
2015年行政工作总结范文
2015/04/09 职场文书
采购内勤岗位职责
2015/04/13 职场文书
中小企业员工手册范本
2015/05/14 职场文书
英语演讲开场白
2015/05/29 职场文书
小王子读书笔记
2015/06/29 职场文书