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读取配置文件模块ConfigParser
May 11 Python
python中 logging的使用详解
Oct 25 Python
python使用tensorflow深度学习识别验证码
Apr 03 Python
python读写csv文件方法详细总结
Jul 05 Python
详解python 中in 的 用法
Dec 12 Python
深入浅析Python 函数注解与匿名函数
Feb 24 Python
Python导入模块包原理及相关注意事项
Mar 25 Python
详解Python中pyautogui库的最全使用方法
Apr 01 Python
python如何变换环境
Jul 21 Python
PyCharm 2020.1版安装破解注册码永久激活(激活到2089年)
Sep 24 Python
Python xlwings插入Excel图片的实现方法
Feb 26 Python
基于Python实现股票收益率分析
Apr 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
2006/12/23 PHP
php foreach 参数强制类型转换的问题
2010/12/10 PHP
APACHE的AcceptPathInfo指令使用介绍
2013/01/18 PHP
win7系统配置php+Apache+mysql环境的方法
2015/08/21 PHP
PHP获取日期对应星期、一周日期、星期开始与结束日期的方法
2018/06/22 PHP
PHP基于GD2函数库实现验证码功能示例
2019/01/27 PHP
js替换字符串的所有示例代码
2013/07/23 Javascript
php读取sqlite数据库入门实例代码
2014/06/25 Javascript
jquery 实现两Select 标签项互调示例代码
2014/09/25 Javascript
js数组的基本操作(很全自己整理的)
2014/10/16 Javascript
JS/Jquery判断对象为空的方法
2015/06/11 Javascript
2016年最热门的15 款代码语法高亮工具,美化你的代码
2016/01/06 Javascript
js捕捉键盘事件和按键键值的方法
2016/10/10 Javascript
JavaScript 实现的checkbox经典实例分享
2016/10/16 Javascript
基于jQuery实现顶部导航栏功能
2016/12/27 Javascript
JS原生轮播图的简单实现(推荐)
2017/07/22 Javascript
JS 仿支付宝input文本输入框放大组件的实例
2017/11/14 Javascript
Vue之mixin全局的用法详解
2018/08/22 Javascript
Angular4.x Event (DOM事件和自定义事件详解)
2018/10/09 Javascript
简单使用webpack打包文件的实现
2019/10/29 Javascript
Typescript3.9 常用新特性一览(推荐)
2020/05/14 Javascript
vuex中store存储store.commit和store.dispatch的用法
2020/07/24 Javascript
[20:57]Ti4主赛事第三天开幕式
2014/07/21 DOTA
[01:11:11]Alliance vs RNG 2019国际邀请赛淘汰赛 败者组BO1 8.20.mp4
2020/07/19 DOTA
Pyramid将models.py文件的内容分布到多个文件的方法
2013/11/27 Python
Python中的sort()方法使用基础教程
2017/01/08 Python
用scikit-learn和pandas学习线性回归的方法
2019/06/21 Python
python使用pip安装SciPy、SymPy、matplotlib教程
2019/11/20 Python
Pytorch使用MNIST数据集实现CGAN和生成指定的数字方式
2020/01/10 Python
美国和加拿大房车出售在线分类广告:RVT.com
2018/04/23 全球购物
欧洲、亚洲、非洲和拉丁美洲的度假套餐:Great Value Vacations
2019/03/30 全球购物
彪马土耳其官网:PUMA土耳其
2019/07/14 全球购物
英国床垫和床架购物网站:Bedman
2019/11/04 全球购物
办公室年度工作总结2015
2015/05/21 职场文书
妇联2016年六一国际儿童节活动总结
2016/04/06 职场文书
2019入党申请书格式和范文
2019/06/25 职场文书