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使用minidom读写xml的方法
Jun 03 Python
python利用matplotlib库绘制饼图的方法示例
Dec 18 Python
python3实现ftp服务功能(客户端)
Mar 24 Python
Python实现完整的事务操作示例
Jun 20 Python
pandas数据框,统计某列数据对应的个数方法
Apr 11 Python
python  创建一个保留重复值的列表的补码
Oct 15 Python
selenium+python设置爬虫代理IP的方法
Nov 29 Python
python装饰器常见使用方法分析
Jun 26 Python
Python通过字典映射函数实现switch
Nov 06 Python
Django用内置方法实现简单搜索功能的方法
Dec 18 Python
python自动化办公操作PPT的实现
Feb 05 Python
Python爬虫之爬取哔哩哔哩热门视频排行榜
Apr 28 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
基于MySQL到MongoDB简易对照表的详解
2013/06/03 PHP
ThinkPHP调用百度翻译类实现在线翻译
2014/06/26 PHP
PHP中可以自动分割查询字符的Parse_str函数使用示例
2014/07/25 PHP
PHP实现Google plus的好友拖拽分组效果
2016/10/21 PHP
jQuery 扩展对input的一些操作方法
2009/10/30 Javascript
jValidate 基于jQuery的表单验证插件
2009/12/12 Javascript
JQuery从头学起第一讲
2010/07/04 Javascript
Jquery 插件开发笔记整理
2011/01/17 Javascript
jQuery中Dom的基本操作小结
2014/01/23 Javascript
JavaScript极简入门教程(二):对象和函数
2014/10/25 Javascript
jQuery选择器之基本选择器与层次选择器
2015/03/03 Javascript
JS原型、原型链深入理解
2016/02/27 Javascript
JavaScript通过HTML的class来获取HTML元素的方法总结
2016/05/24 Javascript
js动态获取子复选项并设计全选及提交的实现方法
2016/06/24 Javascript
详解Vue中添加过渡效果
2017/03/20 Javascript
Vue实现商品飞入购物车效果(电商项目)
2019/11/26 Javascript
在微信小程序中渲染HTML内容3种解决方案及分析与问题解决
2020/01/12 Javascript
Vue列表如何实现滚动到指定位置样式改变效果
2020/05/09 Javascript
小程序分享链接onShareAppMessage的具体用法
2020/05/22 Javascript
JavaScript语句错误throw、try及catch实例解析
2020/08/18 Javascript
解决antd的Form组件setFieldsValue的警告问题
2020/10/29 Javascript
在Python 2.7即将停止支持时,我们为你带来了一份python 3.x迁移指南
2018/01/30 Python
Python enumerate函数功能与用法示例
2019/03/01 Python
python使用tkinter库实现五子棋游戏
2019/06/18 Python
python中使用paramiko模块并实现远程连接服务器执行上传下载功能
2020/02/29 Python
python爬虫数据保存到mongoDB的实例方法
2020/07/28 Python
HTML5 transform三维立方体实现360无死角三维旋转效果
2014/08/22 HTML / CSS
美国奢侈品在线团购网站:Gilt City
2017/11/16 全球购物
测绘工程个人的自我评价
2013/11/23 职场文书
中式婚礼主持词
2014/03/13 职场文书
2014年人事部工作总结
2014/12/03 职场文书
2015年店长个人工作总结
2015/10/23 职场文书
2016幼儿园教师节新闻稿
2015/11/25 职场文书
Python深度学习之Pytorch初步使用
2021/05/20 Python
python 实现体质指数BMI计算
2021/05/26 Python
python如何利用traceback获取详细的异常信息
2021/06/05 Python