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统计文件行数示例分享
Feb 21 Python
Python中列表和元组的相关语句和方法讲解
Aug 20 Python
深入解析Python设计模式编程中建造者模式的使用
Mar 02 Python
Python 获取当前所在目录的方法详解
Aug 02 Python
Python数据结构之栈、队列的实现代码分享
Dec 04 Python
Python编程argparse入门浅析
Feb 07 Python
儿童python练习实例
May 27 Python
python3读取csv和xlsx文件的实例
Jun 22 Python
Python queue队列原理与应用案例分析
Sep 27 Python
Python表达式的优先级详解
Feb 18 Python
Python如何实现的二分查找算法
May 27 Python
Python设计密码强度校验程序
Jul 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数组中包含中文的排序方法
2014/06/03 PHP
详解PHP实现执行定时任务
2015/12/21 PHP
PHP如何根据文件头检测文件类型实例代码
2018/10/14 PHP
PHP 判断字符串是中文还是英文, 或者是中英混合
2021/03/09 PHP
slice函数的用法 之不错的应用
2006/12/29 Javascript
javascript 中对象的继承〔转贴〕
2007/01/22 Javascript
Javascript基础教程之比较null和undefined值
2016/05/16 Javascript
js实现加载更多功能实例
2016/10/27 Javascript
javaScript+turn.js实现图书翻页效果实例代码
2017/02/16 Javascript
jquery插件开发之选项卡制作详解
2017/08/30 jQuery
VUE 3D轮播图封装实现方法
2018/07/03 Javascript
vue移动端项目缓存问题实践记录
2018/10/29 Javascript
mpvue小程序循环动画开启暂停的实现方法
2019/05/15 Javascript
详解node.js创建一个web服务器(Server)的详细步骤
2021/01/15 Javascript
[00:35]DOTA2上海特级锦标赛 MVP.Phx战队宣传片
2016/03/04 DOTA
[11:33]DAC2018 4.5SOLO赛决赛 MidOne vs Paparazi第二场
2018/04/06 DOTA
python中的__slots__使用示例
2015/02/26 Python
Python Socket编程详细介绍
2017/03/23 Python
Python内置模块turtle绘图详解
2017/12/09 Python
浅谈Matplotlib简介和pyplot的简单使用——文本标注和箭头
2018/01/09 Python
PyQt5 QListWidget选择多项并返回的实例
2019/06/17 Python
tensorflow入门:TFRecordDataset变长数据的batch读取详解
2020/01/20 Python
django admin后管定制-显示字段的实例
2020/03/11 Python
CSS3实现头像旋转效果
2017/03/13 HTML / CSS
六一儿童节活动策划方案
2014/01/27 职场文书
《蒲公英》教学反思
2014/02/28 职场文书
潘婷洗发水广告词
2014/03/14 职场文书
师范生求职信
2014/06/14 职场文书
就业协议书怎么填
2014/09/15 职场文书
政府领导干部个人对照检查材料思想汇报
2014/09/24 职场文书
个人四风问题整改措施思想汇报
2014/10/04 职场文书
2015年街道除四害工作总结
2015/05/15 职场文书
搞笑欢迎词大全
2015/09/30 职场文书
2016简历自荐信优秀范文
2016/01/29 职场文书
初中英语教学反思范文
2016/02/15 职场文书
SQL模糊查询报:ORA-00909:参数个数无效问题的解决
2021/06/21 Oracle