Python-Flask:动态创建表的示例详解
今天小编从项目的实际出发,由于项目某一个表的数据达到好几十万条,此时数据的增删查改会很慢;为了增加提高访问的速度,我们引入动态创建表。
代码如下:
fromapp_factoryimportapp fromsqlalchemyimportColumn,String,Integer classProjectModel(app.db.model,app.db.Mixin): tablename='Project_' ID=Column(String(50),name='ID',doc='id') PROJECTNUMBER=Column(String(100),name='PROJECTNUMBER',doc='项目编号') ...... @staticmethod defcreate_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语句createtable....
代码如下:
classSQLAlchemyDB(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()=lambdaself:{c.name:getattr(self,c.name,None)forcinself.__table__.columns} self.Session=sessionmaker(bind=self.engine) self.ScopedSession=lambda:scoped_session(self.Session) #释放碎片空间 deffree_idle_space(self): returnself.execute('purgerecyclebin') defconnstatus(self): returnself.engine.pool.status() defclose(self): self.conn.close() self.engine.dispose() #非返回数据的记录语句 defexecute(self,sqlexpr) try: ret=self.conn.execute(sqlalchemy.text(sqlexpr)) exceptExceptionaserr: returnFalse,str(err) exceptsqlalchemy.exc.InvalidRequestErroraserr: returnFalse,str(err) returnTrue,'' #动态拼接sql语句,创建表 defcreate_table(self,tablename,structs): fieldinfos=[] forstructinstructs: defaultvalue=struct.get('default') ifdefaultvalue: defaultvalue="'{0}'".format(defaultvalue)iftype(defaultvalue)=='str'elsestr(defaultvalue) fieldinfos.append('{0}{1}{2}{3}{4}'.format(struct['fieldname'],struct['type'],'primarykey'ifstruct.get('primary')else'',('default'+defaultvalue)ifdefaultvalueelse'',''ifstruct.get('isnull')else'notnull')) sql='createtable{0}({1})'.format(tablename,','.join(fieldinfos)) ret,err=self.execute(sql) ifret: self.__app.sync_record(tablename,'sql_createtable',{},sql) returnret,err #动态判断表是否存在 defexisttable(self,tablename): ret,err=self.GetRecordCount("user_all_table","TABLE_NAME='"+tablename+"'") returnret>0,err defGetRecordCount(self,tablename,where=None): sql='selectcount(*)asnumfrom{0}{1}'.format(tablename,('where'+where))ifwhere!=Noneelse'') recs,err=self.query(sql) ifrecs: forrecinrecs: returnrec['num'],'' return-1,err #查询数据记录 defquery(self,sqlexpr): try: recs=self.conn.execute(sqlalchemy.text(sqlexpr) returnrecs,'' expectExceptionaserr: returnNone,str(err) expectsqlalchemy.exc.InvalidRequestErroraserr: returnNone,str(err)
那么,类似的:
1-如果动态的对已经创建的表格进行增删查改,那么可以用类似的思想,进行对sql语句进行拼接,insertselectdeleteupdate
2-判断是否存在此字段,进去拼接查询这个字段查出的数据是否为空(count)
3-在原来表的基础上增加字段,或者修改字段,用alter
以上这篇Python-Flask:动态创建表的示例详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。