# -*- coding:utf8 -*- from mysql import connector from appPublic.argsConvert import ArgsConvert,ConditionConvert from .sor import SQLor from .ddl_template_mysql import mysql_ddl_tmpl class MySqlor(SQLor): ddl_template = mysql_ddl_tmpl db2modelTypeMapping = { 'tinyint':'short', 'smallint':'short', 'mediumint':'long', 'int':'long', 'bigint':'long', 'decimal':'float', 'double':'float', 'float':'float', 'char':'char', 'varchar':'str', 'tinyblob':'text', 'tinytext':'text', 'mediumblob':'text', 'mediumtext':'text', 'blob':'text', 'text':'text', 'mediumblob':'text', 'mediumtext':'text', 'longblob':'bin', 'longtext':'text', 'barbinary':'text', 'binary':'text', 'date':'date', 'time':'time', 'datetime':'datetime', 'timestamp':'datestamp', 'year':'short', } model2dbTypemapping = { 'date':'date', 'time':'date', 'timestamp':'timestamp', 'str':'varchar', 'char':'char', 'short':'int', 'long':'bigint', 'float':'double', 'text':'longtext', 'bin':'longblob', 'file':'longblob', } @classmethod def isMe(self,name): return name=='mysql.connector' def grammar(self): return { 'select':select_stmt, } def _opendb(self): self.conn = connector.connect(**self.dbdesc['kwargs']) def placeHolder(self,varname): if varname=='__mainsql__' : return '' return '%s' def dataConvert(self,dataList): if type(dataList) == type({}): d = [ i for i in dataList.values()] else: d = [ i['value'] for i in dataList] return tuple(d) def pagingSQL(self,sql,paging,NS): """ default it not support paging """ page = int(NS.get(paging['pagename'],1)) rows = int(NS.get(paging['rowsname'],10)) sort = NS.get(paging.get('sortname','sort'),None) order = NS.get(paging.get('ordername','asc'),'asc') if not sort: return sql if page < 1: page = 1 from_line = (page - 1) * rows end_line = page * rows + 1 psql = self.pagingSQLmodel() ns={ 'from_line':from_line, 'end_line':end_line, 'rows':rows, 'sort':sort, 'order':order, } ac = ArgsConvert('$[',']$') psql = ac.convert(psql,ns) retSQL=psql % sql return retSQL def pagingSQLmodel(self): return u"""select * from (%s) A order by $[sort]$ $[order]$ limit $[from_line]$,$[rows]$""" def tablesSQL(self): sqlcmd = """SELECT lower(TABLE_NAME) as name, lower(TABLE_COMMENT) as title FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '%s'""" % self.dbdesc.get('dbname','unknown') return sqlcmd def fieldsSQL(self,tablename=None): sqlcmd=""" select lower(column_name) as name, data_type as type, case when character_maximum_length is null then NUMERIC_PRECISION else character_maximum_length end as length, NUMERIC_SCALE as dec1, lower(is_nullable) as nullable, column_comment as title, lower(table_name) as table_name from information_schema.columns where lower(TABLE_SCHEMA) = '%s' """ % self.dbdesc.get('dbname','unknown').lower() if tablename is not None: sqlcmd = sqlcmd + """and lower(table_name)='%s';""" % tablename.lower() return sqlcmd def fkSQL(self,tablename=None): sqlcmd = """SELECT C.TABLE_SCHEMA 拥有者, C.REFERENCED_TABLE_NAME 父表名称 , C.REFERENCED_COLUMN_NAME 父表字段 , C.TABLE_NAME 子表名称, C.COLUMN_NAME 子表字段, C.CONSTRAINT_NAME 约束名, T.TABLE_COMMENT 表注释, R.UPDATE_RULE 约束更新规则, R.DELETE_RULE 约束删除规则 FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE C JOIN INFORMATION_SCHEMA. TABLES T ON T.TABLE_NAME = C.TABLE_NAME JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS R ON R.TABLE_NAME = C.TABLE_NAME AND R.CONSTRAINT_NAME = C.CONSTRAINT_NAME AND R.REFERENCED_TABLE_NAME = C.REFERENCED_TABLE_NAME WHERE C.REFERENCED_TABLE_NAME IS NOT NULL ; and C.TABLE_SCHEMA = '%s' """ % self.dbdesc.get('dbname','unknown').lower() if tablename is not None: sqlcmd = sqlcmd + " and C.REFERENCED_TABLE_NAME = '%s'" % tablename.lower() return sqlcmd def pkSQL(self,tablename=None): sqlcmd = """SELECT lower(c.table_name) as table_name, lower(c.COLUMN_NAME) as field_name FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS t, INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS c WHERE t.CONSTRAINT_TYPE = 'PRIMARY KEY' AND t.TABLE_SCHEMA = '%s' AND t.TABLE_NAME = c.TABLE_NAME """ % self.dbdesc.get('dbname','unknown').lower() if tablename is not None: sqlcmd = sqlcmd + " AND c.TABLE_NAME = '%s'" % tablename.lower() return sqlcmd def indexesSQL(self,tablename=None): sqlcmd = """SELECT DISTINCT lower(index_name) as index_name, lower(index_type) as index_type, lower(table_name) as table_name, lower(column_name) as column_name FROM information_schema.statistics WHERE table_schema = '%s'""" % self.dbdesc.get('dbname','unknown') if tablename is not None: sqlcmd = sqlcmd + """ AND table_name = '%s'""" % tablename.lower() return sqlcmd