Python-Flask:动态创建表的示例详解

 更新时间:2019年11月22日 16:32:23   作者:Odyssues_lee  
今天小编就为大家分享一篇Python-Flask:动态创建表的示例详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

今天小编从项目的实际出发,由于项目某一个表的数据达到好几十万条,此时数据的增删查改会很慢;为了增加提高访问的速度,我们引入动态创建表。

代码如下:

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如何输出百分比

    这篇文章主要介绍了Python 如何输出百分比,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • python如何在word中存储本地图片

    python如何在word中存储本地图片

    这篇文章主要介绍了python如何在word中存储本地图片,想了解docx模块的同学,可以参考下
    2021-04-04
  • 对python sklearn one-hot编码详解

    对python sklearn one-hot编码详解

    今天小编就为大家分享一篇对python sklearn one-hot编码详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • matplotlib简介,安装和简单实例代码

    matplotlib简介,安装和简单实例代码

    这篇文章主要介绍了matplotlib简介,安装和简单实例代码,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • Python安装Matplotlib包完整步骤记录

    Python安装Matplotlib包完整步骤记录

    这篇文章主要给大家介绍了关于Python安装Matplotlib包的相关资料,Matplotlib是一个Python 2D绘图库,它以多种硬拷贝格式和跨平台的交互式环境生成出版物质量的图形,需要的朋友可以参考下
    2023-12-12
  • 微信跳一跳自动运行python脚本

    微信跳一跳自动运行python脚本

    这篇文章主要为大家详细介绍了微信小程序跳一跳自动运行脚本,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • Python实现的HTTP并发测试完整示例

    Python实现的HTTP并发测试完整示例

    这篇文章主要介绍了Python实现的HTTP并发测试,涉及Python多线程并发操作相关实现技巧,需要的朋友可以参考下
    2015-05-05
  • django框架中ajax的使用及避开CSRF 验证的方式详解

    django框架中ajax的使用及避开CSRF 验证的方式详解

    这篇文章主要介绍了django框架中ajax的使用及避开CSRF 验证的方式,结合实例形式分析了Django框架ajax后台交互与排除验证csrf相关操作技巧,需要的朋友可以参考下
    2019-12-12
  • 图文详解OpenCV中光流以及视频特征点追踪

    图文详解OpenCV中光流以及视频特征点追踪

    光流是空间运动物体在观察成像平面上的像素运动的瞬时速度,是利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一帧跟当前帧之间存在的相应关系,这篇文章主要给大家介绍了关于OpenCV中光流以及视频特征点追踪的相关资料,需要的朋友可以参考下
    2021-08-08
  • 基于python实现聊天室程序

    基于python实现聊天室程序

    这篇文章主要为大家详细介绍了基于python实现聊天室程序,该程序由客户端与服务器构成,使用UDP服务,实现了群发、私发、点对点文件互传功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-07-07

最新评论