sqlor/sqlor/mysqlor.py
2019-06-03 18:07:21 +08:00

180 lines
5.0 KiB
Python

# -*- 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