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交换变量
Sep 06 Python
Python Deque 模块使用详解
Jul 04 Python
python中lambda函数 list comprehension 和 zip函数使用指南
Sep 28 Python
Python入门篇之面向对象
Oct 20 Python
Python使用scrapy采集数据过程中放回下载过大页面的方法
Apr 08 Python
Python中几种操作字符串的方法的介绍
Apr 09 Python
Python闭包实现计数器的方法
May 05 Python
python在linux系统下获取系统内存使用情况的方法
May 11 Python
python文件绝对路径写法介绍(windows)
Dec 25 Python
python实现串口通信的示例代码
Feb 10 Python
python实现读取类别频数数据画水平条形图案例
Apr 24 Python
教你用python实现一个无界面的小型图书管理系统
May 21 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
咖啡磨器 如何选购一台适合家用的意式磨豆机
2021/03/05 新手入门
留言板翻页的实现详解
2006/10/09 PHP
CodeIgniter读写分离实现方法详解
2016/01/20 PHP
php 判断字符串编码是utf-8 或gb2312实例
2016/11/01 PHP
List the Stored Procedures in a SQL Server database
2007/06/20 Javascript
JavaScript 快捷键设置实现代码
2009/03/13 Javascript
document.all的一个比较完整的总结及案例
2013/01/31 Javascript
jquery的ajax请求全面了解
2013/03/20 Javascript
Iframe 自动适应页面的高度示例代码
2014/02/26 Javascript
js的hasownproperty使用示例
2014/03/02 Javascript
封装了一个支持匿名函数的Javascript事件监听器
2014/06/05 Javascript
jQuery表单域选择器用法分析
2015/02/10 Javascript
jQuery ajax请求返回list数据动态生成input标签,并把list数据赋值到input标签
2016/03/29 Javascript
AngularJS 表达式详细讲解及实例代码
2016/07/26 Javascript
Vue.js每天必学之指令系统与自定义指令
2016/09/07 Javascript
100多个基础常用JS函数和语法集合大全
2017/02/16 Javascript
AngularJS ionic手势事件的使用总结
2017/08/09 Javascript
ES6中Array.copyWithin()函数的用法实例详解
2017/09/16 Javascript
详解node服务器中打开html文件的两种方法
2017/09/18 Javascript
React-Router如何进行页面权限管理的方法
2017/12/06 Javascript
JS pushlet XMLAdapter适配器用法案例解析
2020/10/16 Javascript
js正则表达式简单校验方法
2021/01/03 Javascript
[43:14]Liquid vs Optic 2018国际邀请赛淘汰赛BO3 第二场 8.21
2018/08/22 DOTA
深入理解Django的中间件middleware
2018/03/14 Python
用python打印菱形的实操方法和代码
2019/06/25 Python
详解Python中正则匹配TAB及空格的小技巧
2019/07/26 Python
HTML5新增加标签和功能概述
2016/09/05 HTML / CSS
广告创意求职信
2014/03/17 职场文书
精彩广告词大全
2014/03/19 职场文书
委托书范文
2014/04/02 职场文书
工商管理专业毕业生求职信
2014/05/26 职场文书
秋季运动会广播稿(30篇)
2014/09/13 职场文书
党的群众路线教育实践活动个人对照检查材料(企业)
2014/11/05 职场文书
求职信格式范文
2015/03/19 职场文书
关于调整工作时间的通知
2015/04/24 职场文书
结婚主持人致辞
2015/07/28 职场文书