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中基于生成器的状态机
Apr 13 Python
使用python实现省市三级菜单效果
Jan 20 Python
Python引用传值概念与用法实例小结
Oct 07 Python
python验证码识别教程之利用投影法、连通域法分割图片
Jun 04 Python
django使用haystack调用Elasticsearch实现索引搜索
Jul 24 Python
Python socket模块ftp传输文件过程解析
Nov 05 Python
keras 特征图可视化实例(中间层)
Jan 24 Python
如何使用pandas读取txt文件中指定的列(有无标题)
Mar 05 Python
python3 使用openpyxl将mysql数据写入xlsx的操作
May 15 Python
Keras load_model 导入错误的解决方式
Jun 09 Python
python属于哪种语言
Aug 16 Python
python可视化大屏库big_screen示例详解
Nov 23 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
哪吒敖丙传:新人物二哥敖乙出场 小敖丙奶气十足
2020/03/08 国漫
用session做客户验证时的注意事项
2006/10/09 PHP
PHP源代码数组统计count分析
2011/08/02 PHP
制作安全性高的PHP网站的几个实用要点
2014/12/30 PHP
PHP生成加减算法方式的验证码实例
2018/03/12 PHP
PHP序列化的四种实现方法与横向对比
2018/11/29 PHP
JS测试显示屏分辨率以及屏幕尺寸的方法
2013/11/22 Javascript
代码触发js事件(click、change)示例应用
2013/12/13 Javascript
javascript的创建多行字符串的7种方法
2014/04/29 Javascript
jQuery中[attribute^=value]选择器用法实例
2014/12/31 Javascript
高性能JavaScript模板引擎实现原理详解
2015/02/05 Javascript
使用jspdf生成pdf报表
2015/07/03 Javascript
node.js中的事件处理机制详解
2016/11/26 Javascript
完美实现js选项卡切换效果(二)
2017/03/08 Javascript
如何编写jquery插件
2017/03/29 jQuery
H5手机端多文件上传预览插件
2017/04/21 Javascript
jQuery扇形定时器插件pietimer使用方法详解
2017/07/18 jQuery
jQuery实现轮播图效果
2019/11/26 jQuery
python中对list去重的多种方法
2014/09/18 Python
Python进程通信之匿名管道实例讲解
2015/04/11 Python
python 实现数字字符串左侧补零的方法
2018/12/04 Python
Python 生成一个从0到n个数字的列表4种方法小结
2019/11/28 Python
在OpenCV里实现条码区域识别的方法示例
2019/12/04 Python
python判断正负数方式
2020/06/03 Python
python语言中有算法吗
2020/06/16 Python
CSS3使用transition实现的鼠标悬停淡入淡出
2015/01/09 HTML / CSS
针对HTML5的Web Worker使用攻略
2015/07/12 HTML / CSS
竞选副班长演讲稿
2014/04/24 职场文书
岗位职责说明书模板
2014/07/30 职场文书
房产公证书
2015/01/23 职场文书
中学生综合素质自我评价
2015/03/06 职场文书
2015年大学生工作总结
2015/04/21 职场文书
银行服务理念口号
2015/12/25 职场文书
2016年优秀党员教师先进事迹材料
2016/02/29 职场文书
Windows中Redis安装配置流程并实现远程访问功能
2021/06/07 Redis
CPU不支持Windows11系统怎么办
2021/11/21 数码科技