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使用PyGame播放Midi和Mp3文件的方法
Apr 24 Python
python图像处理之镜像实现方法
May 30 Python
Python的for和break循环结构中使用else语句的技巧
May 24 Python
python实现可以断点续传和并发的ftp程序
Sep 13 Python
Python 基础教程之包和类的用法
Feb 23 Python
基于python实现简单日历
Jul 28 Python
python 在sql语句中使用%s,%d,%f说明
Jun 06 Python
pytorch判断是否cuda 判断变量类型方式
Jun 23 Python
python的flask框架难学吗
Jul 31 Python
Python unittest装饰器实现原理及代码
Sep 08 Python
sublime3之内网安装python插件Anaconda的流程
Nov 10 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
PHP+javascript模拟Matrix画面
2006/10/09 PHP
php中设置index.php文件为只读的方法
2013/02/06 PHP
javascript 一段左右两边随屏滚动的代码
2009/06/18 Javascript
fireworks菜单生成器mm_menu.js在 IE 7.0 显示问题的解决方法
2009/10/20 Javascript
jquery 双色表格实现代码
2009/12/08 Javascript
Zero Clipboard js+swf实现的复制功能使用方法
2010/03/07 Javascript
腾讯的ip接口 方便获取当前用户的ip地理位置
2010/11/25 Javascript
基于jquery的复制网页内容到WORD的实现代码
2011/02/16 Javascript
使用JavaScript进行进制转换将字符串转换为十进制
2014/09/21 Javascript
Jquery promise实现一张一张加载图片
2015/11/13 Javascript
JQuery中attr属性和jQuery.data()学习笔记【必看】
2016/05/18 Javascript
使用jquery.qrcode.js生成二维码插件
2016/10/17 Javascript
基于JavaScript实现Tab选项卡切换效果
2016/11/24 Javascript
基于slideout.js实现移动端侧边栏滑动特效
2016/11/28 Javascript
angularJS深拷贝详解
2017/03/23 Javascript
用Vue写一个分页器的示例代码
2018/04/22 Javascript
Vue 使用中的小技巧
2018/04/26 Javascript
Vue 组件传值几种常用方法【总结】
2018/05/28 Javascript
微信小程序methods中定义的方法互相调用的实例代码
2018/08/07 Javascript
Vue下拉框回显并默认选中随机问题
2018/09/06 Javascript
通过扫小程序码实现网站登陆功能
2019/08/22 Javascript
[01:43]倾听DOTA2英雄之声 魅惑魔女国服配音鉴赏
2013/06/06 DOTA
Python对列表中的各项进行关联详解
2017/08/15 Python
python http接口自动化脚本详解
2018/01/02 Python
Pycharm2017版本设置启动时默认自动打开项目的方法
2018/10/29 Python
利用Python将文本中的中英文分离方法
2018/10/31 Python
Python基于进程池实现多进程过程解析
2020/04/30 Python
python matlab库简单用法讲解
2020/12/31 Python
进程的查看和调度分别使用什么命令
2015/03/25 面试题
出纳担保书范文
2014/04/02 职场文书
党委书记个人检查对照材料思想汇报
2014/10/11 职场文书
简历自我评价优缺点
2015/03/11 职场文书
2019年浪漫婚礼证婚词
2019/06/27 职场文书
opencv深入浅出了解机器学习和深度学习
2022/03/17 Python
排查并解决MySQL生产库内存使用率高的报警
2022/04/11 MySQL
MySQL transaction事务安全示例讲解
2022/06/21 MySQL