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 16 Python
Python的Flask开发框架简单上手笔记
Nov 16 Python
Python使用defaultdict读取文件各列的方法
May 11 Python
用pandas按列合并两个文件的实例
Apr 12 Python
Python实现监控键盘鼠标操作示例【基于pyHook与pythoncom模块】
Sep 04 Python
python使用Matplotlib画饼图
Sep 25 Python
使用python-opencv读取视频,计算视频总帧数及FPS的实现
Dec 10 Python
新手入门学习python Numpy基础操作
Mar 02 Python
python实现拼接图片
Mar 23 Python
Python爬虫使用bs4方法实现数据解析
Aug 25 Python
Python爬虫开发与项目实战
Dec 16 Python
Python初识逻辑与if语句及用法大全
Aug 07 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基础陷阱题(变量赋值)
2012/09/12 PHP
PHP类型约束用法示例
2016/09/28 PHP
php简单处理XML数据的方法示例
2017/05/19 PHP
超级24小时弹窗代码 24小时退出弹窗代码 100%弹窗代码(IE only)
2010/06/11 Javascript
基于jquery的无刷新分页技术
2011/06/11 Javascript
实用的JS正则表达式(手机号码/IP正则/邮编正则/电话等)
2013/01/11 Javascript
jquery实现的随机多彩tag标签随机颜色和字号大小效果
2014/03/27 Javascript
jQuery实现友好的轮播图片特效
2015/01/12 Javascript
深入探讨JavaScript String对象
2015/03/09 Javascript
js生成验证码并直接在前端判断
2015/05/15 Javascript
基于JS实现EOS隐藏错误提示层代码
2016/04/25 Javascript
sencha ext js 6 快速入门(必看)
2016/06/01 Javascript
js 打开新页面在屏幕中间的实现方法
2016/11/02 Javascript
详解在Vue中通过自定义指令获取dom元素
2017/03/04 Javascript
基于nodejs 的多页面爬虫实例代码
2017/05/31 NodeJs
[58:57]2018DOTA2亚洲邀请赛3月29日小组赛B组 Effect VS VGJ.T
2018/03/30 DOTA
利用numpy实现一、二维数组的拼接简单代码示例
2017/12/15 Python
Jupyter notebook远程访问服务器的方法
2018/05/24 Python
python中int与str互转方法
2018/07/02 Python
python 多线程将大文件分开下载后在合并的实例
2018/11/09 Python
浅谈python3发送post请求参数为空的情况
2018/12/28 Python
python石头剪刀布小游戏(三局两胜制)
2021/01/20 Python
Python基于Socket实现简单聊天室
2020/02/17 Python
python使用matplotlib:subplot绘制多个子图的示例
2020/09/24 Python
Python爬虫自动化爬取b站实时弹幕实例方法
2021/01/26 Python
CSS3让登陆面板3D旋转起来
2016/05/03 HTML / CSS
创立科技Java面试题
2015/11/29 面试题
写给爸爸的道歉信
2014/01/15 职场文书
大学新闻系自荐书
2014/05/31 职场文书
暑期教师培训方案
2014/06/07 职场文书
2014个人年度工作总结
2014/12/15 职场文书
给女朋友的道歉短信
2015/05/12 职场文书
暑假生活随笔
2015/08/15 职场文书
学生会干部任命书
2015/09/21 职场文书
Python turtle实现贪吃蛇游戏
2021/06/18 Python
jackson json序列化实现首字母大写,第二个字母需小写
2021/06/29 Java/Android