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自动格式化json文件的方法
Mar 11 Python
Python验证码识别处理实例
Dec 28 Python
基于Linux系统中python matplotlib画图的中文显示问题的解决方法
Jun 15 Python
python使用Apriori算法进行关联性解析
Dec 21 Python
微信跳一跳小游戏python脚本
Jan 05 Python
对Python random模块打乱数组顺序的实例讲解
Nov 08 Python
PyQT实现菜单中的复制,全选和清空的功能的方法
Jun 17 Python
django rest framework vue 实现用户登录详解
Jul 29 Python
Python图像处理库PIL的ImageFilter模块使用介绍
Feb 26 Python
如何设置PyCharm中的Python代码模版(推荐)
Nov 20 Python
Autopep8的使用(python自动编排工具)
Mar 02 Python
用基于python的appium爬取b站直播消费记录
Apr 17 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
当海贼王变成JOJO风
2020/03/02 日漫
excellent!――ASCII Art(由目标图象生成ascii)
2007/02/20 PHP
php快递单号查询接口使用示例
2014/05/05 PHP
JQuery 将元素显示在屏幕的中央的代码
2010/02/27 Javascript
javascript onmouseout 解决办法
2010/07/17 Javascript
js Form.elements[i]的使用实例
2011/11/13 Javascript
js动态设置鼠标事件示例代码
2013/10/30 Javascript
鼠标拖拽移动子窗体的JS实现
2014/02/25 Javascript
javascript实现密码强度显示
2015/03/18 Javascript
javascript图片预加载实例分析
2015/07/16 Javascript
javascript实现简单的页面右下角提示信息框
2015/07/31 Javascript
AngularJS基础 ng-model 指令详解及示例代码
2016/08/02 Javascript
Google 地图叠加层实例讲解
2016/08/06 Javascript
angularjs点击图片放大实现上传图片预览
2017/02/24 Javascript
Vue学习笔记进阶篇之单元素过度
2017/07/19 Javascript
angularJS的radio实现单项二选一的使用方法
2018/02/28 Javascript
了解ESlint和其相关操作小结
2018/05/21 Javascript
jQuery实现聊天对话框
2020/02/08 jQuery
在Chrome DevTools中调试JavaScript的实现
2020/04/07 Javascript
Node.js API详解之 dns模块用法实例分析
2020/05/15 Javascript
解决vue-router路由拦截造成死循环问题
2020/08/05 Javascript
JavaScript日期库date-fn.js使用方法解析
2020/09/09 Javascript
[13:40]TI3青蛙君全程回顾 DOTA2我们为梦想再战
2013/09/13 DOTA
简明 Python 基础学习教程
2007/02/08 Python
Python连接DB2数据库
2016/08/27 Python
Python 专题一 函数的基础知识
2017/03/16 Python
python 实时得到cpu和内存的使用情况方法
2018/06/11 Python
pandas 将list切分后存入DataFrame中的实例
2018/07/03 Python
使用Python3+PyQT5+Pyserial 实现简单的串口工具方法
2019/02/13 Python
使用HTML5 Canvas为图片填充颜色和纹理的教程
2016/03/21 HTML / CSS
英国在线花园中心:You Garden
2018/06/03 全球购物
国际经济贸易专业推荐信
2013/11/06 职场文书
网吧七夕活动策划方案
2014/08/31 职场文书
报到证办理个人委托书
2014/10/06 职场文书
2019新员工心得体会
2019/06/25 职场文书
mysql数据插入覆盖和时间戳的问题及解决
2022/03/25 MySQL