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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。