This commit is contained in:
yumoqing 2019-06-03 18:07:21 +08:00
parent 7a3a3836bb
commit abff571985
13 changed files with 1050 additions and 1024 deletions

View File

@ -1,42 +1,42 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from distutils.core import setup from distutils.core import setup
from setuptools import setup, find_packages from setuptools import setup, find_packages
# usage: # usage:
# python setup.py bdist_wininst generate a window executable file # python setup.py bdist_wininst generate a window executable file
# python setup.py bdist_egg generate a egg file # python setup.py bdist_egg generate a egg file
# Release information about eway # Release information about eway
version = "0.0.1" version = "0.0.1"
description = "sqlor" description = "sqlor"
author = "yumoqing" author = "yumoqing"
email = "yumoqing@gmail.com" email = "yumoqing@gmail.com"
packages=find_packages() packages=find_packages()
package_data = {} package_data = {}
setup( setup(
name="sqlor", name="sqlor",
version=version, version=version,
# uncomment the following lines if you fill them out in release.py # uncomment the following lines if you fill them out in release.py
description=description, description=description,
author=author, author=author,
author_email=email, author_email=email,
install_requires=[ install_requires=[
], ],
packages=packages, packages=packages,
package_data=package_data, package_data=package_data,
keywords = [ keywords = [
], ],
classifiers = [ classifiers = [
'Development Status :: 1 - Alpha', 'Development Status :: 1 - Alpha',
'Operating System :: OS Independent', 'Operating System :: OS Independent',
'Programming Language :: Python3.5', 'Programming Language :: Python3.5',
'Topic :: SQL execute :: Libraries :: Python Modules', 'Topic :: SQL execute :: Libraries :: Python Modules',
], ],
platforms= 'any' platforms= 'any'
) )

View File

@ -196,9 +196,11 @@ class DBPools:
sor = await self.getSqlor(dbname) sor = await self.getSqlor(dbname)
try: try:
ret = await func(sor,dbname,*args,**kw) ret = await func(sor,dbname,*args,**kw)
await sor.conn.commit()
return ret return ret
except Exception as e: except Exception as e:
print('error',sor) print('error',sor)
sor.conn.rollback()
raise e raise e
finally: finally:
await self.freeSqlor(sor) await self.freeSqlor(sor)
@ -209,19 +211,21 @@ class DBPools:
@wraps(func) @wraps(func)
async def wrap_func(dbname,NS,callback=None,**kw): async def wrap_func(dbname,NS,callback=None,**kw):
sor = await self.getSqlor(dbname) sor = await self.getSqlor(dbname)
ret = None
try: try:
desc = func(dbname,NS,callback=callback,**kw) desc = func(dbname,NS,callback=callback,**kw)
ret = await sor.runSQL(desc,NS,callback,**kw) ret = await sor.runSQL(desc,NS,callback,**kw)
await sor.conn.commit()
if NS.get('dummy'): if NS.get('dummy'):
return NS['dummy'] return NS['dummy']
else: else:
return [] return []
except Exception as e: except Exception as e:
print('error:',e) print('error:',e)
await sor.conn.rollback()
raise e raise e
finally: finally:
await self.freeSqlor(sor) await self.freeSqlor(sor)
return ret
return wrap_func return wrap_func
def runSQLPaging(self,func): def runSQLPaging(self,func):

View File

@ -1,55 +1,55 @@
mysql_ddl_tmpl = """{% macro typeStr(type,len,dec) %} mysql_ddl_tmpl = """{% macro typeStr(type,len,dec) %}
{%- if type=='str' -%} {%- if type=='str' -%}
VARCHAR({{len}}) VARCHAR({{len}})
{%- elif type=='char' -%} {%- elif type=='char' -%}
CHAR({{len}}) CHAR({{len}})
{%- elif type=='long' or type=='int' or type=='short' -%} {%- elif type=='long' or type=='int' or type=='short' -%}
int int
{%- elif type=='long' -%} {%- elif type=='long' -%}
bigint bigint
{%- elif type=='float' or type=='double' or type=='ddouble' -%} {%- elif type=='float' or type=='double' or type=='ddouble' -%}
double({{len}},{{dec}}) double({{len}},{{dec}})
{%- elif type=='date' -%} {%- elif type=='date' -%}
date date
{%- elif type=='time' -%} {%- elif type=='time' -%}
time time
{%- elif type=='datetime' -%} {%- elif type=='datetime' -%}
datetime datetime
{%- elif type=='timestamp' -%} {%- elif type=='timestamp' -%}
TIMESTAMP TIMESTAMP
{%- elif type=='text' -%} {%- elif type=='text' -%}
longtext longtext
{%- elif type=='bin' -%} {%- elif type=='bin' -%}
longblob longblob
{%- else -%} {%- else -%}
{{type}} {{type}}
{%- endif %} {%- endif %}
{%- endmacro %} {%- endmacro %}
{% macro nullStr(nullable) %} {% macro nullStr(nullable) %}
{%- if nullable=='no' -%} {%- if nullable=='no' -%}
NOT NULL NOT NULL
{%- endif -%} {%- endif -%}
{% endmacro %} {% endmacro %}
{% macro primary() %} {% macro primary() %}
{% if len(','.join(summary[0].primary))>0 %} {% if len(','.join(summary[0].primary))>0 %}
,primary key({{','.join(summary[0].primary)}}) ,primary key({{','.join(summary[0].primary)}})
{% endif %} {% endif %}
{% endmacro %} {% endmacro %}
drop table {{summary[0].name}}; drop table {{summary[0].name}};
CREATE TABLE {{summary[0].name}} CREATE TABLE {{summary[0].name}}
( (
{% for field in fields %} {% for field in fields %}
{{field.name}} {{typeStr(field.type,field.length,field.dec)}} {{nullStr(field.nullable)}} {%if field.title -%} comment '{{field.title}}'{%- endif %}{%- if not loop.last -%},{%- endif -%} {{field.name}} {{typeStr(field.type,field.length,field.dec)}} {{nullStr(field.nullable)}} {%if field.title -%} comment '{{field.title}}'{%- endif %}{%- if not loop.last -%},{%- endif -%}
{% endfor %} {% endfor %}
{{primary()}} {{primary()}}
) )
engine=innodb engine=innodb
default charset=utf8 default charset=utf8
{% if summary[0].title %}comment '{{summary[0].title}}'{% endif %} {% if summary[0].title %}comment '{{summary[0].title}}'{% endif %}
; ;
{% for v in validation %} {% for v in validation %}
{% if v.oper=='idx' %} {% if v.oper=='idx' %}
CREATE {% if v.value.idxtype=='unique' %}UNIQUE{% endif %} INDEX {{summary[0].name}}_{{v.name}} ON {{summary[0].name}}({{",".join(v.value.fields)}}); CREATE {% if v.value.idxtype=='unique' %}UNIQUE{% endif %} INDEX {{summary[0].name}}_{{v.name}} ON {{summary[0].name}}({{",".join(v.value.fields)}});
{% endif %} {% endif %}
{%- endfor -%} {%- endfor -%}
""" """

View File

@ -1,49 +1,49 @@
oracle_ddl_tmpl = """{% macro typeStr(type,len,dec) %} oracle_ddl_tmpl = """{% macro typeStr(type,len,dec) %}
{%- if type=='str' -%} {%- if type=='str' -%}
VARCHAR2({{len}}) VARCHAR2({{len}})
{%- elif type=='char' -%} {%- elif type=='char' -%}
CHAR({{len}}) CHAR({{len}})
{%- elif type=='long' or type=='int' or type=='short' -%} {%- elif type=='long' or type=='int' or type=='short' -%}
NUMBER NUMBER
{%- elif type=='float' or type=='double' or type=='ddouble' -%} {%- elif type=='float' or type=='double' or type=='ddouble' -%}
NUMBER({{len}},{{dec}}) NUMBER({{len}},{{dec}})
{%- elif type=='date' or type=='time' -%} {%- elif type=='date' or type=='time' -%}
DATE DATE
{%- elif type=='timestamp' -%} {%- elif type=='timestamp' -%}
TIMESTAMP TIMESTAMP
{%- elif type=='text' -%} {%- elif type=='text' -%}
CLOB CLOB
{%- elif type=='bin' -%} {%- elif type=='bin' -%}
BLOB BLOB
{%- else -%} {%- else -%}
{{type}} {{type}}
{%- endif %} {%- endif %}
{%- endmacro %} {%- endmacro %}
{% macro nullStr(nullable) %} {% macro nullStr(nullable) %}
{%- if nullable=='no' -%} {%- if nullable=='no' -%}
NOT NULL NOT NULL
{%- endif -%} {%- endif -%}
{% endmacro %} {% endmacro %}
{% macro primary() %} {% macro primary() %}
{% if len(','.join(summary[0].primary))>0 %} {% if len(','.join(summary[0].primary))>0 %}
,primary key({{','.join(summary[0].primary)}}) ,primary key({{','.join(summary[0].primary)}})
{% endif %} {% endif %}
{% endmacro %} {% endmacro %}
drop table {{summary[0].name}}; drop table {{summary[0].name}};
CREATE TABLE {{summary[0].name}} CREATE TABLE {{summary[0].name}}
( (
{% for field in fields %} {% for field in fields %}
{{field.name}} {{typeStr(field.type,field.length,field.dec)}} {{nullStr(field.nullable)}}{%- if not loop.last -%},{%- endif -%} {{field.name}} {{typeStr(field.type,field.length,field.dec)}} {{nullStr(field.nullable)}}{%- if not loop.last -%},{%- endif -%}
{% endfor %} {% endfor %}
{{primary()}} {{primary()}}
); );
{% for v in validation %} {% for v in validation %}
{% if v.oper=='idx' %} {% if v.oper=='idx' %}
CREATE {% if v.value.idxtype=='unique' %}UNIQUE{% endif %} INDEX {{summary[0].name}}_{{v.name}} ON {{summary[0].name}}({{",".join(v.value.fields)}}); CREATE {% if v.value.idxtype=='unique' %}UNIQUE{% endif %} INDEX {{summary[0].name}}_{{v.name}} ON {{summary[0].name}}({{",".join(v.value.fields)}});
{% endif %} {% endif %}
{%- endfor -%} {%- endfor -%}
COMMENT ON TABLE {{summary[0].name}} IS '{{summary[0].title}}'; COMMENT ON TABLE {{summary[0].name}} IS '{{summary[0].title}}';
{% for field in fields %} {% for field in fields %}
COMMENT ON COLUMN {{summary[0].name}}.{{field.name}} is '{{field.title}}'; COMMENT ON COLUMN {{summary[0].name}}.{{field.name}} is '{{field.title}}';
{% endfor %} {% endfor %}
""" """

View File

@ -1,45 +1,45 @@
postgresql_ddl_tmpl = """{% macro typeStr(type,len,dec) %} postgresql_ddl_tmpl = """{% macro typeStr(type,len,dec) %}
{%- if type=='str' -%} {%- if type=='str' -%}
VARCHAR({{len}}) VARCHAR({{len}})
{%- elif type=='char' -%} {%- elif type=='char' -%}
CHAR({{len}}) CHAR({{len}})
{%- elif type=='long' or type=='int' or type=='short' -%} {%- elif type=='long' or type=='int' or type=='short' -%}
INTEGER INTEGER
{%- elif type=='float' or type=='double' or type=='ddouble' -%} {%- elif type=='float' or type=='double' or type=='ddouble' -%}
NUMERIC({{len}},{{dec}}) NUMERIC({{len}},{{dec}})
{%- elif type=='date' -%} {%- elif type=='date' -%}
DATE DATE
{%- elif type=='time' -%} {%- elif type=='time' -%}
TIME TIME
{%- elif type=='timestamp' -%} {%- elif type=='timestamp' -%}
TIMESTAMP TIMESTAMP
{%- else -%} {%- else -%}
{{type}} {{type}}
{%- endif %} {%- endif %}
{%- endmacro %} {%- endmacro %}
{% macro nullStr(nullable) %} {% macro nullStr(nullable) %}
{%- if nullable=='no' -%} {%- if nullable=='no' -%}
NOT NULL NOT NULL
{%- endif -%} {%- endif -%}
{% endmacro %} {% endmacro %}
{% macro primary() %} {% macro primary() %}
primary key({{','.join(summary[0].primary)}}) primary key({{','.join(summary[0].primary)}})
{% endmacro %} {% endmacro %}
DROP TABLE IF EXISTS {{summary[0].name}}; DROP TABLE IF EXISTS {{summary[0].name}};
CREATE TABLE {{summary[0].name}} CREATE TABLE {{summary[0].name}}
( (
{% for field in fields %} {% for field in fields %}
{{field.name}} {{typeStr(field.type,field.length,field.dec)}} {{nullStr(field.nullable)}}, {{field.name}} {{typeStr(field.type,field.length,field.dec)}} {{nullStr(field.nullable)}},
{% endfor %} {% endfor %}
{{primary()}} {{primary()}}
); );
{% for v in validation %} {% for v in validation %}
{% if v.oper=='idx' %} {% if v.oper=='idx' %}
CREATE {% if v.value.idxtype=='unique' %}UNIQUE{% endif %} INDEX {{summary[0].name}}_{{v.name}} ON {{summary[0].name}}({{",".join(v.value.fields)}}); CREATE {% if v.value.idxtype=='unique' %}UNIQUE{% endif %} INDEX {{summary[0].name}}_{{v.name}} ON {{summary[0].name}}({{",".join(v.value.fields)}});
{% endif %} {% endif %}
{%- endfor -%} {%- endfor -%}
COMMENT ON TABLE {{summary[0].name}} IS '{{summary[0].title.decode('utf8')}}'; COMMENT ON TABLE {{summary[0].name}} IS '{{summary[0].title.decode('utf8')}}';
{% for field in fields %} {% for field in fields %}
COMMENT ON COLUMN {{summary[0].name}}.{{field.name}} is '{{field.title.decode('utf8')}}'; COMMENT ON COLUMN {{summary[0].name}}.{{field.name}} is '{{field.title.decode('utf8')}}';
{% endfor %} {% endfor %}
""" """

View File

@ -1,51 +1,51 @@
sqlserver_ddl_tmpl = """{% macro typeStr(type,len,dec) %} sqlserver_ddl_tmpl = """{% macro typeStr(type,len,dec) %}
{%- if type=='str' -%} {%- if type=='str' -%}
NVARCHAR({{len}}) NVARCHAR({{len}})
{%- elif type=='char' -%} {%- elif type=='char' -%}
CHAR({{len}}) CHAR({{len}})
{%- elif type=='long' or type=='int' or type=='short' -%} {%- elif type=='long' or type=='int' or type=='short' -%}
NUMERIC NUMERIC
{%- elif type=='float' or type=='double' or type=='ddouble' -%} {%- elif type=='float' or type=='double' or type=='ddouble' -%}
numeric({{len}},{{dec}}) numeric({{len}},{{dec}})
{%- elif type=='date' or type=='time' -%} {%- elif type=='date' or type=='time' -%}
DATE DATE
{%- elif type=='timestamp' -%} {%- elif type=='timestamp' -%}
TIMESTAMP TIMESTAMP
{%- elif type=='text' -%} {%- elif type=='text' -%}
NVARCHAR(MAX) NVARCHAR(MAX)
{%- elif type=='bin' -%} {%- elif type=='bin' -%}
IMAGE IMAGE
{%- else -%} {%- else -%}
{{type}} {{type}}
{%- endif %} {%- endif %}
{%- endmacro %} {%- endmacro %}
{% macro nullStr(nullable) %} {% macro nullStr(nullable) %}
{%- if nullable=='no' -%} {%- if nullable=='no' -%}
NOT NULL NOT NULL
{%- endif -%} {%- endif -%}
{% endmacro %} {% endmacro %}
{% macro primary() %} {% macro primary() %}
{% if len(','.join(summary[0].primary))>0 %} {% if len(','.join(summary[0].primary))>0 %}
,primary key({{','.join(summary[0].primary)}}) ,primary key({{','.join(summary[0].primary)}})
{% endif %} {% endif %}
{% endmacro %} {% endmacro %}
drop table dbo.{{summary[0].name}}; drop table dbo.{{summary[0].name}};
CREATE TABLE dbo.{{summary[0].name}} CREATE TABLE dbo.{{summary[0].name}}
( (
{% for field in fields %} {% for field in fields %}
{{field.name}} {{typeStr(field.type,field.length,field.dec)}} {{nullStr(field.nullable)}}{%- if not loop.last -%},{%- endif -%} {{field.name}} {{typeStr(field.type,field.length,field.dec)}} {{nullStr(field.nullable)}}{%- if not loop.last -%},{%- endif -%}
{% endfor %} {% endfor %}
{{primary()}} {{primary()}}
) )
{% for v in validation %} {% for v in validation %}
{% if v.oper=='idx' %} {% if v.oper=='idx' %}
CREATE {% if v.value.idxtype=='unique' %}UNIQUE{% endif %} INDEX {{summary[0].name}}_{{v.name}} ON {{summary[0].name}}({{",".join(v.value.fields)}}); CREATE {% if v.value.idxtype=='unique' %}UNIQUE{% endif %} INDEX {{summary[0].name}}_{{v.name}} ON {{summary[0].name}}({{",".join(v.value.fields)}});
{% endif %} {% endif %}
{%- endfor -%} {%- endfor -%}
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'{{summary[0].title}}' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'{{summary[0].name}}' EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'{{summary[0].title}}' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'{{summary[0].name}}'
{% for field in fields %} {% for field in fields %}
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'{{field.title}}' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'{{summary[0].name}}', @level2type=N'COLUMN',@level2name=N'{{field.name}}' EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'{{field.title}}' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'{{summary[0].name}}', @level2type=N'COLUMN',@level2name=N'{{field.name}}'
{% endfor %} {% endfor %}
""" """

View File

@ -1,175 +1,175 @@
# -*- coding:utf8 -*- # -*- coding:utf8 -*-
from .sor import SQLor from .sor import SQLor
from .ddl_template_sqlserver import sqlserver_ddl_tmpl from .ddl_template_sqlserver import sqlserver_ddl_tmpl
class MsSqlor(SQLor): class MsSqlor(SQLor):
ddl_template = sqlserver_ddl_tmpl ddl_template = sqlserver_ddl_tmpl
db2modelTypeMapping = { db2modelTypeMapping = {
'bit':'short', 'bit':'short',
'tinyint':'short', 'tinyint':'short',
'date':'date', 'date':'date',
'bigint':'long', 'bigint':'long',
'smallint':'short', 'smallint':'short',
'int':'long', 'int':'long',
'decimal':'float', 'decimal':'float',
'numeric':'float', 'numeric':'float',
'smallmoney':'float', 'smallmoney':'float',
'money':'float', 'money':'float',
'real':'float', 'real':'float',
'float':'float', 'float':'float',
'datetime':'date', 'datetime':'date',
'timestamp':'timestamp', 'timestamp':'timestamp',
'uniqueidentifier':'timestamp', 'uniqueidentifier':'timestamp',
'char':'char', 'char':'char',
'varchar':'str', 'varchar':'str',
'text':'text', 'text':'text',
'nchar':'str', 'nchar':'str',
'nvarchar':'str', 'nvarchar':'str',
'ntext':'text', 'ntext':'text',
'binary':'str', 'binary':'str',
'varbinary':'str', 'varbinary':'str',
'image':'file', 'image':'file',
} }
model2dbTypemapping = { model2dbTypemapping = {
'date':'datetime', 'date':'datetime',
'time':'date', 'time':'date',
'timestamp':'timestamp', 'timestamp':'timestamp',
'str':'nvarchar', 'str':'nvarchar',
'char':'char', 'char':'char',
'short':'int', 'short':'int',
'long':'numeric', 'long':'numeric',
'float':'numeric', 'float':'numeric',
'text':'ntext', 'text':'ntext',
'file':'image', 'file':'image',
} }
@classmethod @classmethod
def isMe(self,name): def isMe(self,name):
return name=='pymssql' return name=='pymssql'
def grammar(self): def grammar(self):
return { return {
'select':select_stmt, 'select':select_stmt,
} }
def placeHolder(self,varname): def placeHolder(self,varname):
if varname=='__mainsql__' : if varname=='__mainsql__' :
return '' return ''
return '%s' return '%s'
def dataConvert(self,dataList): def dataConvert(self,dataList):
if type(dataList) == type({}): if type(dataList) == type({}):
d = [ i for i in dataList.values()] d = [ i for i in dataList.values()]
else: else:
d = [ i['value'] for i in dataList] d = [ i['value'] for i in dataList]
return tuple(d) return tuple(d)
def pagingSQLmodel(self): def pagingSQLmodel(self):
return u"""select * return u"""select *
from ( from (
select row_number() over(order by $[sort]$ $[order]$) as _row_id,page_s.* select row_number() over(order by $[sort]$ $[order]$) as _row_id,page_s.*
from (%s) page_s from (%s) page_s
) A ) A
where _row_id >= $[from_line]$ and _row_id < $[end_line]$""" where _row_id >= $[from_line]$ and _row_id < $[end_line]$"""
def tablesSQL(self): def tablesSQL(self):
sqlcmd = u"""select sqlcmd = u"""select
lower(d.name) as name, lower(d.name) as name,
lower(cast(Isnull(f.VALUE,d.name) as nvarchar )) title lower(cast(Isnull(f.VALUE,d.name) as nvarchar )) title
from sysobjects d from sysobjects d
left join sys.extended_properties f on d.id = f.major_id and f.minor_id = 0 left join sys.extended_properties f on d.id = f.major_id and f.minor_id = 0
where d.xtype = 'U'""" where d.xtype = 'U'"""
return sqlcmd return sqlcmd
def fieldsSQL(self,tablename=None): def fieldsSQL(self,tablename=None):
sqlcmd=u"""SELECT name = lower(a.name) sqlcmd=u"""SELECT name = lower(a.name)
,type = b.name ,type = b.name
,length = Columnproperty(a.id,a.name,'PRECISION') ,length = Columnproperty(a.id,a.name,'PRECISION')
,dec = Isnull(Columnproperty(a.id,a.name,'Scale'),null) ,dec = Isnull(Columnproperty(a.id,a.name,'Scale'),null)
,nullable = CASE ,nullable = CASE
WHEN a.isnullable = 1 THEN 'yes' WHEN a.isnullable = 1 THEN 'yes'
ELSE 'no' ELSE 'no'
END END
,title = lower(cast(Isnull(g.[value],a.name) as nvarchar) ) ,title = lower(cast(Isnull(g.[value],a.name) as nvarchar) )
,table_name = lower(d.name) ,table_name = lower(d.name)
FROM syscolumns a FROM syscolumns a
LEFT JOIN systypes b LEFT JOIN systypes b
ON a.xusertype = b.xusertype ON a.xusertype = b.xusertype
INNER JOIN sysobjects d INNER JOIN sysobjects d
ON (a.id = d.id) ON (a.id = d.id)
AND (d.xtype = 'U') AND (d.xtype = 'U')
AND (d.name <> 'dtproperties') AND (d.name <> 'dtproperties')
INNER JOIN sys.all_objects c INNER JOIN sys.all_objects c
ON d.id=c.object_id ON d.id=c.object_id
AND schema_name(schema_id)='dbo' AND schema_name(schema_id)='dbo'
LEFT JOIN sys.extended_properties g LEFT JOIN sys.extended_properties g
ON (a.id = g.major_id) ON (a.id = g.major_id)
AND (a.colid = g.minor_id) AND (a.colid = g.minor_id)
LEFT JOIN sys.extended_properties f LEFT JOIN sys.extended_properties f
ON (d.id = f.major_id) ON (d.id = f.major_id)
AND (f.minor_id = 0)""" AND (f.minor_id = 0)"""
if tablename is not None: if tablename is not None:
sqlcmd = sqlcmd + """ where lower(d.name)='%s' sqlcmd = sqlcmd + """ where lower(d.name)='%s'
ORDER BY a.id,a.colorder""" % tablename.lower() ORDER BY a.id,a.colorder""" % tablename.lower()
else: else:
sqlcmd = sqlcmd + """ ORDER BY a.id,a.colorder""" sqlcmd = sqlcmd + """ ORDER BY a.id,a.colorder"""
return sqlcmd return sqlcmd
def fkSQL(self,tablename=None): def fkSQL(self,tablename=None):
sqlcmd = u"""select sqlcmd = u"""select
MainCol.name AS field -- [主表列名] MainCol.name AS field -- [主表列名]
,oSub.name AS fk_table -- [子表名称], ,oSub.name AS fk_table -- [子表名称],
,SubCol.name AS fk_field -- [子表列名], ,SubCol.name AS fk_field -- [子表列名],
from from
sys.foreign_keys fk sys.foreign_keys fk
JOIN sys.all_objects oSub JOIN sys.all_objects oSub
ON (fk.parent_object_id = oSub.object_id) ON (fk.parent_object_id = oSub.object_id)
JOIN sys.all_objects oMain JOIN sys.all_objects oMain
ON (fk.referenced_object_id = oMain.object_id) ON (fk.referenced_object_id = oMain.object_id)
JOIN sys.foreign_key_columns fkCols JOIN sys.foreign_key_columns fkCols
ON (fk.object_id = fkCols.constraint_object_id) ON (fk.object_id = fkCols.constraint_object_id)
JOIN sys.columns SubCol JOIN sys.columns SubCol
ON (oSub.object_id = SubCol.object_id ON (oSub.object_id = SubCol.object_id
AND fkCols.parent_column_id = SubCol.column_id) AND fkCols.parent_column_id = SubCol.column_id)
JOIN sys.columns MainCol JOIN sys.columns MainCol
ON (oMain.object_id = MainCol.object_id ON (oMain.object_id = MainCol.object_id
AND fkCols.referenced_column_id = MainCol.column_id)""" AND fkCols.referenced_column_id = MainCol.column_id)"""
if tablename is not None: if tablename is not None:
sqlcmd = sqlcmd + """ where lower(oMain.name) = '%s'""" % tablename.lower() sqlcmd = sqlcmd + """ where lower(oMain.name) = '%s'""" % tablename.lower()
return sqlcmd return sqlcmd
def pkSQL(self,tablename=None): def pkSQL(self,tablename=None):
sqlcmd = u"""select sqlcmd = u"""select
lower(a.table_name) as table_name, lower(a.table_name) as table_name,
lower(b.column_name) as field_name lower(b.column_name) as field_name
from information_schema.table_constraints a from information_schema.table_constraints a
inner join information_schema.constraint_column_usage b inner join information_schema.constraint_column_usage b
on a.constraint_name = b.constraint_name on a.constraint_name = b.constraint_name
where a.constraint_type = 'PRIMARY KEY'""" where a.constraint_type = 'PRIMARY KEY'"""
if tablename is not None: if tablename is not None:
sqlcmd = sqlcmd + """ and lower(a.table_name) = '%s'""" % tablename.lower() sqlcmd = sqlcmd + """ and lower(a.table_name) = '%s'""" % tablename.lower()
return sqlcmd return sqlcmd
def indexesSQL(self,tablename=None): def indexesSQL(self,tablename=None):
sqlcmd = """SELECT sqlcmd = """SELECT
index_name=lower(IDX.Name), index_name=lower(IDX.Name),
index_type=case when KC.type_desc is null then 'primary' WHEN IDX.is_unique=1 THEN 'unique' ELSE 'ununique' END, index_type=case when KC.type_desc is null then 'primary' WHEN IDX.is_unique=1 THEN 'unique' ELSE 'ununique' END,
table_name=lower(O.Name), table_name=lower(O.Name),
column_name=lower(C.Name) column_name=lower(C.Name)
FROM sys.indexes IDX FROM sys.indexes IDX
INNER JOIN sys.index_columns IDXC INNER JOIN sys.index_columns IDXC
ON IDX.[object_id]=IDXC.[object_id] ON IDX.[object_id]=IDXC.[object_id]
AND IDX.index_id=IDXC.index_id AND IDX.index_id=IDXC.index_id
LEFT JOIN sys.key_constraints KC LEFT JOIN sys.key_constraints KC
ON IDX.[object_id]=KC.[parent_object_id] ON IDX.[object_id]=KC.[parent_object_id]
AND IDX.index_id=KC.unique_index_id AND IDX.index_id=KC.unique_index_id
INNER JOIN sys.objects O INNER JOIN sys.objects O
ON O.[object_id]=IDX.[object_id] ON O.[object_id]=IDX.[object_id]
INNER JOIN sys.columns C INNER JOIN sys.columns C
ON O.[object_id]=C.[object_id] ON O.[object_id]=C.[object_id]
AND O.type='U' AND O.type='U'
AND O.is_ms_shipped=0 AND O.is_ms_shipped=0
AND IDXC.Column_id=C.Column_id""" AND IDXC.Column_id=C.Column_id"""
if tablename is not None: if tablename is not None:
sqlcmd = sqlcmd + """ where lower(O.name)='%s'""" % tablename.lower() sqlcmd = sqlcmd + """ where lower(O.name)='%s'""" % tablename.lower()
return sqlcmd return sqlcmd

View File

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

View File

@ -1,131 +1,131 @@
from .sor import SQLor from .sor import SQLor
from .ddl_template_oracle import oracle_ddl_tmpl from .ddl_template_oracle import oracle_ddl_tmpl
class Oracleor(SQLor): class Oracleor(SQLor):
ddl_template = oracle_ddl_tmpl ddl_template = oracle_ddl_tmpl
db2modelTypeMapping = { db2modelTypeMapping = {
'char':'char', 'char':'char',
'nchar':'str', 'nchar':'str',
'varchar':'str', 'varchar':'str',
'varchar2':'str', 'varchar2':'str',
'nvarchar2':'str', 'nvarchar2':'str',
'number':'long', 'number':'long',
'integer':'long', 'integer':'long',
'binary_float':'float', 'binary_float':'float',
'binary_double':'float', 'binary_double':'float',
'float':'float', 'float':'float',
'timestamp':'timestamp', 'timestamp':'timestamp',
'timestamp with time zone':'timestamp', 'timestamp with time zone':'timestamp',
'timestamp with local time zone':'timestamp', 'timestamp with local time zone':'timestamp',
'interval year to moth':'date', 'interval year to moth':'date',
'interval day to second':'timestamp', 'interval day to second':'timestamp',
'clob':'text', 'clob':'text',
'nclob':'text', 'nclob':'text',
'blob':'file', 'blob':'file',
'bfile':'file', 'bfile':'file',
'date':'date', 'date':'date',
} }
model2dbTypemapping = { model2dbTypemapping = {
'date':'date', 'date':'date',
'time':'date', 'time':'date',
'timestamp':'date', 'timestamp':'date',
'str':'varchar2', 'str':'varchar2',
'char':'char', 'char':'char',
'short':'number', 'short':'number',
'long':'number', 'long':'number',
'float':'number', 'float':'number',
'text':'nclob', 'text':'nclob',
'file':'blob', 'file':'blob',
} }
@classmethod @classmethod
def isMe(self,name): def isMe(self,name):
return name=='cx_Oracle' return name=='cx_Oracle'
def grammar(self): def grammar(self):
return { return {
'select':select_stmt, 'select':select_stmt,
} }
def placeHolder(self,varname): def placeHolder(self,varname):
if varname=='__mainsql__' : if varname=='__mainsql__' :
return '' return ''
return ':%s' % varname return ':%s' % varname
def dataConvert(self,dataList): def dataConvert(self,dataList):
if type(dataList) == type({}): if type(dataList) == type({}):
return dataList return dataList
d = {} d = {}
[ d.update({i['name']:i['value']}) for i in dataList ] [ d.update({i['name']:i['value']}) for i in dataList ]
return d return d
def pagingSQLmodel(self): def pagingSQLmodel(self):
return u"""select * return u"""select *
from ( from (
select page_s.*,rownum row_id select page_s.*,rownum row_id
from (%s) page_s from (%s) page_s
order by $[sort]$ $[order]$ order by $[sort]$ $[order]$
) )
where row_id >=$[from_line]$ and row_id < $[end_line]$""" where row_id >=$[from_line]$ and row_id < $[end_line]$"""
def tablesSQL(self): def tablesSQL(self):
sqlcmd = """select sqlcmd = """select
lower(table_name) as name, lower(table_name) as name,
lower(decode(comments,null,table_name,comments)) as title lower(decode(comments,null,table_name,comments)) as title
from USER_TAB_COMMENTS where table_type = 'TABLE'""" from USER_TAB_COMMENTS where table_type = 'TABLE'"""
return sqlcmd return sqlcmd
def fieldsSQL(self,tablename=None): def fieldsSQL(self,tablename=None):
sqlcmd="""select lower(utc.COLUMN_NAME) name sqlcmd="""select lower(utc.COLUMN_NAME) name
,utc.DATA_TYPE type ,utc.DATA_TYPE type
,utc.DATA_LENGTH length ,utc.DATA_LENGTH length
,utc.data_scale dec ,utc.data_scale dec
,case when utc.nullable = 'Y' then 'yes' else 'no' end nullable ,case when utc.nullable = 'Y' then 'yes' else 'no' end nullable
,lower(nvl(ucc.comments,utc.COLUMN_NAME)) title ,lower(nvl(ucc.comments,utc.COLUMN_NAME)) title
,lower(utc.table_name) as table_name ,lower(utc.table_name) as table_name
from user_tab_cols utc left join USER_COL_COMMENTS ucc on utc.table_name = ucc.table_name and utc.COLUMN_NAME = ucc.COLUMN_NAME""" from user_tab_cols utc left join USER_COL_COMMENTS ucc on utc.table_name = ucc.table_name and utc.COLUMN_NAME = ucc.COLUMN_NAME"""
if tablename is not None: if tablename is not None:
sqlcmd = sqlcmd + """ where lower(utc.table_name) = '%s'""" % tablename.lower() sqlcmd = sqlcmd + """ where lower(utc.table_name) = '%s'""" % tablename.lower()
return sqlcmd return sqlcmd
def fkSQL(self,tablename=None): def fkSQL(self,tablename=None):
tablename = tablename.lower() tablename = tablename.lower()
sqlcmd = """select sqlcmd = """select
distinct(ucc.column_name) as field,rela.table_name as fk_table,rela.column_name as fk_field distinct(ucc.column_name) as field,rela.table_name as fk_table,rela.column_name as fk_field
from from
user_constraints uc,user_cons_columns ucc, user_constraints uc,user_cons_columns ucc,
( (
select t2.table_name,t2.column_name,t1.r_constraint_name select t2.table_name,t2.column_name,t1.r_constraint_name
from user_constraints t1,user_cons_columns t2 from user_constraints t1,user_cons_columns t2
where t1.r_constraint_name=t2.constraint_name where t1.r_constraint_name=t2.constraint_name
) rela ) rela
where where
uc.constraint_name=ucc.constraint_name uc.constraint_name=ucc.constraint_name
and uc.r_constraint_name=rela.r_constraint_name""" and uc.r_constraint_name=rela.r_constraint_name"""
if tablename is not None: if tablename is not None:
sqlcmd = sqlcmd + """ and lower(uc.table_name)='%s'""" % tablename.lower() sqlcmd = sqlcmd + """ and lower(uc.table_name)='%s'""" % tablename.lower()
return sqlcmd return sqlcmd
def pkSQL(self,tablename=None): def pkSQL(self,tablename=None):
sqlcmd = """ sqlcmd = """
select select
lower(col.table_name) table_name, lower(col.table_name) table_name,
lower(col.column_name) as field_name lower(col.column_name) as field_name
from from
user_constraints con,user_cons_columns col user_constraints con,user_cons_columns col
where where
con.constraint_name=col.constraint_name and con.constraint_type='P'""" con.constraint_name=col.constraint_name and con.constraint_type='P'"""
if tablename is not None: if tablename is not None:
sqlcmd = sqlcmd + """ and lower(col.table_name)='%s'""" % tablename.lower() sqlcmd = sqlcmd + """ and lower(col.table_name)='%s'""" % tablename.lower()
return sqlcmd return sqlcmd
def indexesSQL(self,tablename=None): def indexesSQL(self,tablename=None):
sqlcmd = """select sqlcmd = """select
lower(a.index_name) index_name, lower(a.index_name) index_name,
lower(a.UNIQUENESS) index_type, lower(a.UNIQUENESS) index_type,
lower(a.table_name) table_name, lower(a.table_name) table_name,
lower(b.column_name) column_name lower(b.column_name) column_name
from user_indexes a, user_ind_columns b from user_indexes a, user_ind_columns b
where a.index_name = b.index_name""" where a.index_name = b.index_name"""
if tablename is not None: if tablename is not None:
sqlcmd += """ and lower(a.table_name) = lower('%s')""" % tablename.lower() sqlcmd += """ and lower(a.table_name) = lower('%s')""" % tablename.lower()
return sqlcmd return sqlcmd

View File

@ -1,199 +1,199 @@
from .sor import SQLor from .sor import SQLor
from .ddl_template_postgresql import postgresql_ddl_tmpl from .ddl_template_postgresql import postgresql_ddl_tmpl
class PostgreSQLor(SQLor): class PostgreSQLor(SQLor):
ddl_template = postgresql_ddl_tmpl ddl_template = postgresql_ddl_tmpl
db2modelTypeMapping = { db2modelTypeMapping = {
'smallint':'short', 'smallint':'short',
'integer':'long', 'integer':'long',
'bigint':'llong', 'bigint':'llong',
'decimal':'float', 'decimal':'float',
'numeric':'float', 'numeric':'float',
'real':'float', 'real':'float',
'double':'float', 'double':'float',
'serial':'long', 'serial':'long',
'bigserial':'llong', 'bigserial':'llong',
'char':'char', 'char':'char',
'character':'char', 'character':'char',
'varchar':'str', 'varchar':'str',
'character varying':'str', 'character varying':'str',
'text':'text', 'text':'text',
'timestamp':'timestamp', 'timestamp':'timestamp',
'date':'date', 'date':'date',
'time':'time', 'time':'time',
'boolean':'char', 'boolean':'char',
'bytea':'file' 'bytea':'file'
} }
model2dbTypemapping = { model2dbTypemapping = {
'date':'date', 'date':'date',
'time':'date', 'time':'date',
'timestamp':'timestamp', 'timestamp':'timestamp',
'str':'varchar', 'str':'varchar',
'char':'char', 'char':'char',
'short':'smallint', 'short':'smallint',
'long':'integer', 'long':'integer',
'float':'numeric', 'float':'numeric',
'text':'text', 'text':'text',
'file':'bytea', 'file':'bytea',
} }
@classmethod @classmethod
def isMe(self,name): def isMe(self,name):
return name=='psycopg2' return name=='psycopg2'
def grammar(self): def grammar(self):
return { return {
'select':select_stmt, 'select':select_stmt,
} }
def placeHolder(self,varname): def placeHolder(self,varname):
if varname=='__mainsql__' : if varname=='__mainsql__' :
return '' return ''
return ':%s' % varname return ':%s' % varname
def dataConvert(self,dataList): def dataConvert(self,dataList):
if type(dataList) == type({}): if type(dataList) == type({}):
return dataList return dataList
d = {} d = {}
[ d.update({i['name']:i['value']}) for i in dataList ] [ d.update({i['name']:i['value']}) for i in dataList ]
return d return d
def pagingSQLmodel(self): def pagingSQLmodel(self):
return u"""select * return u"""select *
from ( from (
select page_s.*,rownum row_id select page_s.*,rownum row_id
from (%s) page_s from (%s) page_s
order by $[sort]$ $[order]$ order by $[sort]$ $[order]$
) )
where row_id >=$[from_line]$ and row_id < $[end_line]$""" where row_id >=$[from_line]$ and row_id < $[end_line]$"""
def tablesSQL(self): def tablesSQL(self):
""" """
列出表名 列出表名
SELECT tablename FROM pg_tables; SELECT tablename FROM pg_tables;
WHERE tablename NOT LIKE 'pg%' WHERE tablename NOT LIKE 'pg%'
AND tablename NOT LIKE 'sql_%' AND tablename NOT LIKE 'sql_%'
ORDER BY tablename; ORDER BY tablename;
""" """
sqlcmd = """select sqlcmd = """select
lower(table_name) as name, lower(table_name) as name,
lower(decode(comments,null,table_name,comments)) as title lower(decode(comments,null,table_name,comments)) as title
from USER_TAB_COMMENTS where table_type = 'TABLE'""" from USER_TAB_COMMENTS where table_type = 'TABLE'"""
return sqlcmd return sqlcmd
def fieldsSQL(self,tablename=None): def fieldsSQL(self,tablename=None):
"""SELECT col_description(a.attrelid,a.attnum) as comment,pg_type.typname as typename,a.attname as name, a.attnotnull as notnull """SELECT col_description(a.attrelid,a.attnum) as comment,pg_type.typname as typename,a.attname as name, a.attnotnull as notnull
FROM pg_class as c,pg_attribute as a inner join pg_type on pg_type.oid = a.atttypid FROM pg_class as c,pg_attribute as a inner join pg_type on pg_type.oid = a.atttypid
where c.relname = 'tablename' and a.attrelid = c.oid and a.attnum>0 where c.relname = 'tablename' and a.attrelid = c.oid and a.attnum>0
""" """
sqlcmd="""select lower(utc.COLUMN_NAME) name sqlcmd="""select lower(utc.COLUMN_NAME) name
,utc.DATA_TYPE type ,utc.DATA_TYPE type
,utc.DATA_LENGTH length ,utc.DATA_LENGTH length
,utc.data_scale dec ,utc.data_scale dec
,case when utc.nullable = 'Y' then 'yes' else 'no' end nullable ,case when utc.nullable = 'Y' then 'yes' else 'no' end nullable
,lower(nvl(ucc.comments,utc.COLUMN_NAME)) title ,lower(nvl(ucc.comments,utc.COLUMN_NAME)) title
,lower(utc.table_name) as table_name ,lower(utc.table_name) as table_name
from user_tab_cols utc left join USER_COL_COMMENTS ucc on utc.table_name = ucc.table_name and utc.COLUMN_NAME = ucc.COLUMN_NAME""" from user_tab_cols utc left join USER_COL_COMMENTS ucc on utc.table_name = ucc.table_name and utc.COLUMN_NAME = ucc.COLUMN_NAME"""
if tablename is not None: if tablename is not None:
sqlcmd = sqlcmd + """ where lower(utc.table_name) = '%s'""" % tablename.lower() sqlcmd = sqlcmd + """ where lower(utc.table_name) = '%s'""" % tablename.lower()
return sqlcmd return sqlcmd
def fkSQL(self,tablename=None): def fkSQL(self,tablename=None):
tablename = tablename.lower() tablename = tablename.lower()
sqlcmd = """select sqlcmd = """select
distinct(ucc.column_name) as field,rela.table_name as fk_table,rela.column_name as fk_field distinct(ucc.column_name) as field,rela.table_name as fk_table,rela.column_name as fk_field
from from
user_constraints uc,user_cons_columns ucc, user_constraints uc,user_cons_columns ucc,
( (
select t2.table_name,t2.column_name,t1.r_constraint_name select t2.table_name,t2.column_name,t1.r_constraint_name
from user_constraints t1,user_cons_columns t2 from user_constraints t1,user_cons_columns t2
where t1.r_constraint_name=t2.constraint_name where t1.r_constraint_name=t2.constraint_name
) rela ) rela
where where
uc.constraint_name=ucc.constraint_name uc.constraint_name=ucc.constraint_name
and uc.r_constraint_name=rela.r_constraint_name""" and uc.r_constraint_name=rela.r_constraint_name"""
if tablename is not None: if tablename is not None:
sqlcmd = sqlcmd + """ and lower(uc.table_name)='%s'""" % tablename.lower() sqlcmd = sqlcmd + """ and lower(uc.table_name)='%s'""" % tablename.lower()
return sqlcmd return sqlcmd
def pkSQL(self,tablename=None): def pkSQL(self,tablename=None):
""" """
select pg_attribute.attname as colname,pg_type.typname as typename,pg_constraint.conname as pk_name from select pg_attribute.attname as colname,pg_type.typname as typename,pg_constraint.conname as pk_name from
pg_constraint inner join pg_class pg_constraint inner join pg_class
on pg_constraint.conrelid = pg_class.oid on pg_constraint.conrelid = pg_class.oid
inner join pg_attribute on pg_attribute.attrelid = pg_class.oid inner join pg_attribute on pg_attribute.attrelid = pg_class.oid
and pg_attribute.attnum = pg_constraint.conkey[1] and pg_attribute.attnum = pg_constraint.conkey[1]
inner join pg_type on pg_type.oid = pg_attribute.atttypid inner join pg_type on pg_type.oid = pg_attribute.atttypid
where pg_class.relname = 'tablename' where pg_class.relname = 'tablename'
and pg_constraint.contype='p' and pg_constraint.contype='p'
""" """
sqlcmd = """ sqlcmd = """
select select
lower(col.table_name) table_name, lower(col.table_name) table_name,
lower(col.column_name) as field_name lower(col.column_name) as field_name
from from
user_constraints con,user_cons_columns col user_constraints con,user_cons_columns col
where where
con.constraint_name=col.constraint_name and con.constraint_type='P'""" con.constraint_name=col.constraint_name and con.constraint_type='P'"""
if tablename is not None: if tablename is not None:
sqlcmd = sqlcmd + """ and lower(col.table_name)='%s'""" % tablename.lower() sqlcmd = sqlcmd + """ and lower(col.table_name)='%s'""" % tablename.lower()
return sqlcmd return sqlcmd
def indexesSQL(self,tablename=None): def indexesSQL(self,tablename=None):
""" """
SELECT SELECT
A.SCHEMANAME, A.SCHEMANAME,
A.TABLENAME, A.TABLENAME,
A.INDEXNAME, A.INDEXNAME,
A.TABLESPACE, A.TABLESPACE,
A.INDEXDEF, A.INDEXDEF,
B.AMNAME, B.AMNAME,
C.INDEXRELID, C.INDEXRELID,
C.INDNATTS, C.INDNATTS,
C.INDISUNIQUE, C.INDISUNIQUE,
C.INDISPRIMARY, C.INDISPRIMARY,
C.INDISCLUSTERED, C.INDISCLUSTERED,
D.DESCRIPTION D.DESCRIPTION
FROM FROM
PG_AM B PG_AM B
LEFT JOIN PG_CLASS F ON B.OID = F.RELAM LEFT JOIN PG_CLASS F ON B.OID = F.RELAM
LEFT JOIN PG_STAT_ALL_INDEXES E ON F.OID = E.INDEXRELID LEFT JOIN PG_STAT_ALL_INDEXES E ON F.OID = E.INDEXRELID
LEFT JOIN PG_INDEX C ON E.INDEXRELID = C.INDEXRELID LEFT JOIN PG_INDEX C ON E.INDEXRELID = C.INDEXRELID
LEFT OUTER JOIN PG_DESCRIPTION D ON C.INDEXRELID = D.OBJOID, LEFT OUTER JOIN PG_DESCRIPTION D ON C.INDEXRELID = D.OBJOID,
PG_INDEXES A PG_INDEXES A
WHERE WHERE
A.SCHEMANAME = E.SCHEMANAME AND A.TABLENAME = E.RELNAME AND A.INDEXNAME = E.INDEXRELNAME A.SCHEMANAME = E.SCHEMANAME AND A.TABLENAME = E.RELNAME AND A.INDEXNAME = E.INDEXRELNAME
AND E.SCHEMANAME = 'public' AND E.RELNAME = 'table_name' AND E.SCHEMANAME = 'public' AND E.RELNAME = 'table_name'
""" """
sqlcmd = """select sqlcmd = """select
lower(a.index_name) index_name, lower(a.index_name) index_name,
lower(a.UNIQUENESS) index_type, lower(a.UNIQUENESS) index_type,
lower(a.table_name) table_name, lower(a.table_name) table_name,
lower(b.column_name) column_name lower(b.column_name) column_name
from user_indexes a, user_ind_columns b from user_indexes a, user_ind_columns b
where a.index_name = b.index_name""" where a.index_name = b.index_name"""
if tablename is not None: if tablename is not None:
sqlcmd += """ and lower(a.table_name) = lower('%s')""" % tablename.lower() sqlcmd += """ and lower(a.table_name) = lower('%s')""" % tablename.lower()
return sqlcmd return sqlcmd

View File

@ -160,14 +160,14 @@ class SQLor(object):
markedSQL,datas = self.maskingSQL(sql,NS) markedSQL,datas = self.maskingSQL(sql,NS)
datas = self.dataConvert(datas) datas = self.dataConvert(datas)
try: try:
markedSQL = markedSQL.encode('utf8') # markedSQL = markedSQL.encode('utf8')
if self.async_mode: if self.async_mode:
await cursor.execute(markedSQL,datas) await cursor.execute(markedSQL,datas)
else: else:
cursor.execute(markedSQL,datas) cursor.execute(markedSQL,datas)
except Exception as e: except Exception as e:
print( "markedSQL=",markedSQL,datas,e) print( "markedSQL=",markedSQL,':',datas,':',e)
raise e raise e
return return

View File

@ -1,100 +1,100 @@
import re import re
from .sor import SQLor from .sor import SQLor
class SQLite3or(SQLor): class SQLite3or(SQLor):
db2modelTypeMapping = { db2modelTypeMapping = {
'char':'char', 'char':'char',
'nchar':'str', 'nchar':'str',
'text':'text', 'text':'text',
'ntext':'text', 'ntext':'text',
'varchar':'str', 'varchar':'str',
'nvarchar':'str', 'nvarchar':'str',
'blob':'file', 'blob':'file',
'integer':'long', 'integer':'long',
'double':'float', 'double':'float',
'date':'date', 'date':'date',
'time':'time', 'time':'time',
'timestamp':'timestamp', 'timestamp':'timestamp',
'number':'long', 'number':'long',
} }
model2dbTypemapping = { model2dbTypemapping = {
'date':'date', 'date':'date',
'time':'time', 'time':'time',
'timestamp':'timestamp', 'timestamp':'timestamp',
'str':'nvarchar', 'str':'nvarchar',
'char':'char', 'char':'char',
'short':'int', 'short':'int',
'long':'integer', 'long':'integer',
'float':'double', 'float':'double',
'text':'ntext', 'text':'ntext',
'file':'blob', 'file':'blob',
} }
@classmethod @classmethod
def isMe(self,name): def isMe(self,name):
return name=='sqlite3' return name=='sqlite3'
def placeHolder(self,varname): def placeHolder(self,varname):
if varname=='__mainsql__' : if varname=='__mainsql__' :
return '' return ''
return '?' return '?'
def dataConvert(self,dataList): def dataConvert(self,dataList):
if type(dataList) == type({}): if type(dataList) == type({}):
d = [ i for i in dataList.values()] d = [ i for i in dataList.values()]
else: else:
d = [ i['value'] for i in dataList] d = [ i['value'] for i in dataList]
return tuple(d) return tuple(d)
def pagingSQLmodel(self): def pagingSQLmodel(self):
sql = u"""select * from (%s) order by $[sort]$ $[order]$ limit $[from_line]$,$[end_line]$""" sql = u"""select * from (%s) order by $[sort]$ $[order]$ limit $[from_line]$,$[end_line]$"""
return sql return sql
def tablesSQL(self): def tablesSQL(self):
sqlcmd = u"""select name, tbl_name as title from sqlite_master where upper(type) = 'TABLE'""" sqlcmd = u"""select name, tbl_name as title from sqlite_master where upper(type) = 'TABLE'"""
return sqlcmd return sqlcmd
def fieldsSQL(self,tablename): def fieldsSQL(self,tablename):
sqlcmd="""PRAGMA table_info('%s')""" % tablename.lower() sqlcmd="""PRAGMA table_info('%s')""" % tablename.lower()
return sqlcmd return sqlcmd
def fields(self,tablename): def fields(self,tablename):
m = u'(\w+)\(((\d+)(,(\d+)){0,1})\){0,1}' m = u'(\w+)\(((\d+)(,(\d+)){0,1})\){0,1}'
k = re.compile(m) k = re.compile(m)
def typesplit(typ): def typesplit(typ):
d = k.search(typ) d = k.search(typ)
if d is None: if d is None:
return typ,0,0 return typ,0,0
return d.group(1),int(d.group(3) if d.group(3) is not None else 0 ),int(d.group(5) if d.group(5) is not None else 0) return d.group(1),int(d.group(3) if d.group(3) is not None else 0 ),int(d.group(5) if d.group(5) is not None else 0)
sqlstring = self.fieldsSQL(tablename) sqlstring = self.fieldsSQL(tablename)
recs = [] recs = []
self.execute(sqlstring,callback=lambda x:recs.append(x)) self.execute(sqlstring,callback=lambda x:recs.append(x))
for r in recs: for r in recs:
t,l,d = typesplit(r['type']) t,l,d = typesplit(r['type'])
r['type'] = t r['type'] = t
r['length'] = int(l) r['length'] = int(l)
r['dec'] = int(d) r['dec'] = int(d)
r['title'] = r['name'] r['title'] = r['name']
ret = [] ret = []
for r in recs: for r in recs:
r.update({'type':self.db2modelTypeMapping[r['type'].lower()]}) r.update({'type':self.db2modelTypeMapping[r['type'].lower()]})
r.update({'name':r['name'].lower()}) r.update({'name':r['name'].lower()})
ret.append(r) ret.append(r)
return ret return ret
def fkSQL(self,tablename): def fkSQL(self,tablename):
sqlcmd = "" sqlcmd = ""
return sqlcmd return sqlcmd
def fkeys(self,tablename): def fkeys(self,tablename):
return [] return []
def primary(self,tablename): def primary(self,tablename):
recs = self.fields(tablename) recs = self.fields(tablename)
ret = [ {'field':r['name']} for r in recs if r['pk'] == 1 ] ret = [ {'field':r['name']} for r in recs if r['pk'] == 1 ]
return ret return ret
def pkSQL(self,tablename): def pkSQL(self,tablename):
sqlcmd = "" sqlcmd = ""
return sqlcmd return sqlcmd

View File

@ -3,6 +3,18 @@ import asyncio
from sqlor.dbpools import DBPools from sqlor.dbpools import DBPools
dbs={ dbs={
"tasks":{
"driver":"aiomysql",
"async_mode":True,
"coding":"utf8",
"dbname":"tasks",
"kwargs":{
"user":"test",
"db":"tasks",
"password":"test123",
"host":"localhost"
}
},
"aiocfae":{ "aiocfae":{
"driver":"aiomysql", "driver":"aiomysql",
"async_mode":True, "async_mode":True,
@ -39,4 +51,14 @@ async def testfunc():
} }
x = await sql('cfae',{},print) x = await sql('cfae',{},print)
async def testfunc1():
@pool.runSQL
def sql(db,ns,callback):
return {
"sql_string":"select * from timeobjects",
}
print('testfunc1(),test tasks database select')
x = await sql('tasks',{},print)
loop.run_until_complete(testfunc()) loop.run_until_complete(testfunc())
loop.run_until_complete(testfunc1())