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 相关文章推荐
在Lighttpd服务器中运行Django应用的方法
Jul 22 Python
python+opencv实现动态物体识别
Jan 09 Python
python保存数据到本地文件的方法
Jun 23 Python
浅谈python下tiff图像的读取和保存方法
Dec 04 Python
PyQt5实现让QScrollArea支持鼠标拖动的操作方法
Jun 19 Python
python打包exe开机自动启动的实例(windows)
Jun 28 Python
Tensorflow 1.0之后模型文件、权重数值的读取方式
Feb 12 Python
vscode写python时的代码错误提醒和自动格式化的方法
May 07 Python
关于PyCharm安装后修改路径名称使其可重新打开的问题
Oct 20 Python
Python3.9.0 a1安装pygame出错解决全过程(小结)
Feb 02 Python
Python基础之变量的相关知识总结
Jun 23 Python
关于pytest结合csv模块实现csv格式的数据驱动问题
May 30 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 函数使用方法与函数定义方法
2010/05/09 PHP
php ajax 静态分页过程形式
2011/09/02 PHP
php基于base64解码图片与加密图片还原实例
2014/11/03 PHP
thinkPHP5框架auth权限控制类与用法示例
2018/06/12 PHP
php实例化一个类的具体方法
2019/09/19 PHP
Javascript 去除数组的重复元素
2010/05/04 Javascript
js 操作select和option常用代码整理
2012/12/13 Javascript
JavaScript栏目列表隐藏/显示简单实现
2013/04/03 Javascript
JQuery设置获取下拉菜单某个选项的值(比较全)
2014/08/05 Javascript
JavaScript检测实例属性, 原型属性
2015/02/04 Javascript
纯JS实现本地图片预览的方法
2015/07/31 Javascript
谈谈JavaScript类型系统之Math
2016/01/06 Javascript
Bootstrap CDN和本地化环境搭建
2016/10/26 Javascript
AngularJS深入探讨scope,继承结构,事件系统和生命周期
2016/11/02 Javascript
js模糊查询实例分享
2016/12/26 Javascript
jQuery实现多张图片上传预览(不经过后端处理)
2017/04/29 jQuery
实现微信小程序的wxml文件和wxss文件在webstrom的支持
2017/06/12 Javascript
vue2.x select2 指令封装详解
2017/10/12 Javascript
微信小程序实现下载进度条的方法
2017/12/08 Javascript
Vue实现base64编码图片间的切换功能
2019/12/04 Javascript
[02:40]DOTA2英雄基础教程 炼金术士
2013/12/23 DOTA
python实现爬虫下载美女图片
2015/07/14 Python
python编程开发之日期操作实例分析
2015/11/13 Python
让python在hadoop上跑起来
2016/01/27 Python
python中字符串变二维数组的实例讲解
2018/04/03 Python
Python操作Sql Server 2008数据库的方法详解
2018/05/17 Python
python引入不同文件夹下的自定义模块方法
2018/10/27 Python
详解Python下载图片并保存本地的两种方式
2019/05/15 Python
python3访问字典里的值实例方法
2020/11/18 Python
法国发饰品牌:Alexandre De Paris
2018/12/04 全球购物
面向对象概念面试题(.NET)
2016/11/04 面试题
Boolean b = new Boolean(“abcde”); 会编译错误码
2013/11/27 面试题
毕业设计说明书
2014/05/07 职场文书
大学同学会活动方案
2014/08/20 职场文书
2015幼儿园新学期寄语
2015/02/27 职场文书
搞笑结婚保证书
2015/05/08 职场文书