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实现的ini文件操作类分享
Nov 20 Python
python通过apply使用元祖和列表调用函数实例
May 26 Python
Django原生sql也能使用Paginator分页的示例代码
Nov 15 Python
浅谈Tensorflow由于版本问题出现的几种错误及解决方法
Jun 13 Python
python读取有密码的zip压缩文件实例
Feb 08 Python
python re库的正则表达式入门学习教程
Mar 08 Python
python实现图片压缩代码实例
Aug 12 Python
Python监控服务器实用工具psutil使用解析
Dec 19 Python
python 5个顶级异步框架推荐
Sep 09 Python
Python加载数据的5种不同方式(收藏)
Nov 13 Python
python+selenium+chrome实现淘宝购物车秒杀自动结算
Jan 07 Python
Python OpenCV实现传统图片格式与base64转换
Jun 13 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 判断网页是否是utf8编码的方法
2014/06/06 PHP
PHP使用mysql_fetch_object从查询结果中获取对象集的方法
2015/03/18 PHP
[原创]PHP实现逐行删除文件右侧空格的方法
2015/12/25 PHP
PHP+JavaScript实现无刷新上传图片
2017/02/21 PHP
jquery photoFrame 图片边框美化显示插件
2010/06/28 Javascript
zTree插件之多选下拉菜单实例代码
2013/11/06 Javascript
Jquery 获取对象的几种方式介绍
2014/01/17 Javascript
实例详解Nodejs 保存 payload 发送过来的文件
2016/01/14 NodeJs
深入解析Backbone.js框架的依赖库Underscore.js的作用
2016/05/07 Javascript
ES6新特性六:promise对象实例详解
2017/04/21 Javascript
jQuery选择器之子元素过滤选择器
2017/09/28 jQuery
写给小白看的JavaScript异步
2017/11/29 Javascript
vue轮播图插件vue-concise-slider的使用
2018/03/13 Javascript
Vue项目使用localStorage+Vuex保存用户登录信息
2019/05/27 Javascript
Vue中全局变量的定义和使用
2019/06/05 Javascript
微信小程序如何连接Java后台
2019/08/08 Javascript
JavaScript实现密码强度实时验证
2020/03/18 Javascript
python绘制条形图方法代码详解
2017/12/19 Python
python合并同类型excel表格的方法
2018/04/01 Python
详解pyqt5 动画在QThread线程中无法运行问题
2018/05/05 Python
python在回调函数中获取返回值的方法
2019/02/22 Python
Python中的random.uniform()函数教程与实例解析
2019/03/02 Python
Django框架之登录后自定义跳转页面的实现方法
2019/07/18 Python
Python图像阈值化处理及算法比对实例解析
2020/06/19 Python
Expedia英国:全球最大的在线旅游公司
2017/09/07 全球购物
简述安装Slackware Linux系统的过程
2012/05/08 面试题
EJB timer的种类
2014/10/28 面试题
Exception类的常用方法
2012/06/16 面试题
建筑工程专业毕业生自荐信
2013/10/19 职场文书
购房意向书范本
2014/04/01 职场文书
医疗器械售后服务承诺书
2014/05/21 职场文书
关于保护环境的标语
2014/06/09 职场文书
2014年小学教导处工作总结
2014/12/19 职场文书
2015年导购员工作总结
2015/04/25 职场文书
撤诉申请书法院范本
2015/05/18 职场文书
解决numpy数组互换两行及赋值的问题
2021/04/17 Python