feat: 代码生成初步适配pg数据库
This commit is contained in:
@@ -3,6 +3,7 @@ from sqlalchemy import delete, func, select, text, update
|
|||||||
from sqlalchemy.ext.asyncio import AsyncSession
|
from sqlalchemy.ext.asyncio import AsyncSession
|
||||||
from sqlalchemy.orm import selectinload
|
from sqlalchemy.orm import selectinload
|
||||||
from typing import List
|
from typing import List
|
||||||
|
from config.env import DataBaseConfig
|
||||||
from module_generator.entity.do.gen_do import GenTable, GenTableColumn
|
from module_generator.entity.do.gen_do import GenTable, GenTableColumn
|
||||||
from module_generator.entity.vo.gen_vo import (
|
from module_generator.entity.vo.gen_vo import (
|
||||||
GenTableBaseModel,
|
GenTableBaseModel,
|
||||||
@@ -127,27 +128,47 @@ class GenTableDao:
|
|||||||
:param is_page: 是否开启分页
|
:param is_page: 是否开启分页
|
||||||
:return: 数据库列表信息对象
|
:return: 数据库列表信息对象
|
||||||
"""
|
"""
|
||||||
query_sql = """
|
if DataBaseConfig.db_type == 'postgresql':
|
||||||
table_name as table_name,
|
query_sql = """
|
||||||
table_comment as table_comment,
|
table_name as table_name,
|
||||||
create_time as create_time,
|
table_comment as table_comment,
|
||||||
update_time as update_time
|
create_time as create_time,
|
||||||
from
|
update_time as update_time
|
||||||
information_schema.tables
|
from
|
||||||
where
|
list_table
|
||||||
table_schema = (select database())
|
where
|
||||||
and table_name not like 'apscheduler\_%'
|
table_name not like 'apscheduler_%'
|
||||||
and table_name not like 'gen\_%'
|
and table_name not like 'gen_%'
|
||||||
and table_name not in (select table_name from gen_table)
|
and table_name not in (select table_name from gen_table)
|
||||||
"""
|
"""
|
||||||
|
else:
|
||||||
|
query_sql = """
|
||||||
|
table_name as table_name,
|
||||||
|
table_comment as table_comment,
|
||||||
|
create_time as create_time,
|
||||||
|
update_time as update_time
|
||||||
|
from
|
||||||
|
information_schema.tables
|
||||||
|
where
|
||||||
|
table_schema = (select database())
|
||||||
|
and table_name not like 'apscheduler\_%'
|
||||||
|
and table_name not like 'gen\_%'
|
||||||
|
and table_name not in (select table_name from gen_table)
|
||||||
|
"""
|
||||||
if query_object.table_name:
|
if query_object.table_name:
|
||||||
query_sql += """and lower(table_name) like lower(concat('%', :table_name, '%'))"""
|
query_sql += """and lower(table_name) like lower(concat('%', :table_name, '%'))"""
|
||||||
if query_object.table_comment:
|
if query_object.table_comment:
|
||||||
query_sql += """and lower(table_comment) like lower(concat('%', :table_comment, '%'))"""
|
query_sql += """and lower(table_comment) like lower(concat('%', :table_comment, '%'))"""
|
||||||
if query_object.begin_time:
|
if query_object.begin_time:
|
||||||
query_sql += """and date_format(create_time, '%Y%m%d') >= date_format(:begin_time, '%Y%m%d')"""
|
if DataBaseConfig.db_type == 'postgresql':
|
||||||
|
query_sql += """and create_time::date >= to_date(:begin_time, 'yyyy-MM-dd')"""
|
||||||
|
else:
|
||||||
|
query_sql += """and date_format(create_time, '%Y%m%d') >= date_format(:begin_time, '%Y%m%d')"""
|
||||||
if query_object.end_time:
|
if query_object.end_time:
|
||||||
query_sql += """and date_format(create_time, '%Y%m%d') >= date_format(:end_time, '%Y%m%d')"""
|
if DataBaseConfig.db_type == 'postgresql':
|
||||||
|
query_sql += """and create_time::date <= to_date(:end_time, 'yyyy-MM-dd')"""
|
||||||
|
else:
|
||||||
|
query_sql += """and date_format(create_time, '%Y%m%d') >= date_format(:end_time, '%Y%m%d')"""
|
||||||
query_sql += """order by create_time desc"""
|
query_sql += """order by create_time desc"""
|
||||||
query = select(
|
query = select(
|
||||||
text(query_sql).bindparams(
|
text(query_sql).bindparams(
|
||||||
@@ -170,20 +191,35 @@ class GenTableDao:
|
|||||||
:param table_names: 业务表名称组
|
:param table_names: 业务表名称组
|
||||||
:return: 数据库列表信息对象
|
:return: 数据库列表信息对象
|
||||||
"""
|
"""
|
||||||
query_sql = """
|
if DataBaseConfig.db_type == 'postgresql':
|
||||||
select
|
query_sql = """
|
||||||
table_name as table_name,
|
select
|
||||||
table_comment as table_comment,
|
table_name as table_name,
|
||||||
create_time as create_time,
|
table_comment as table_comment,
|
||||||
update_time as update_time
|
create_time as create_time,
|
||||||
from
|
update_time as update_time
|
||||||
information_schema.tables
|
from
|
||||||
where
|
list_table
|
||||||
table_name not like 'qrtz\_%'
|
where
|
||||||
and table_name not like 'gen\_%'
|
table_name not like 'qrtz_%'
|
||||||
and table_schema = (select database())
|
and table_name not like 'gen_%'
|
||||||
and table_name in :table_names
|
and table_name = any(:table_names)
|
||||||
"""
|
"""
|
||||||
|
else:
|
||||||
|
query_sql = """
|
||||||
|
select
|
||||||
|
table_name as table_name,
|
||||||
|
table_comment as table_comment,
|
||||||
|
create_time as create_time,
|
||||||
|
update_time as update_time
|
||||||
|
from
|
||||||
|
information_schema.tables
|
||||||
|
where
|
||||||
|
table_name not like 'qrtz\_%'
|
||||||
|
and table_name not like 'gen\_%'
|
||||||
|
and table_schema = (select database())
|
||||||
|
and table_name in :table_names
|
||||||
|
"""
|
||||||
query = text(query_sql).bindparams(table_names=tuple(table_names))
|
query = text(query_sql).bindparams(table_names=tuple(table_names))
|
||||||
gen_db_table_list = (await db.execute(query)).fetchall()
|
gen_db_table_list = (await db.execute(query)).fetchall()
|
||||||
|
|
||||||
@@ -256,32 +292,42 @@ class GenTableColumnDao:
|
|||||||
:param table_name: 业务表名称
|
:param table_name: 业务表名称
|
||||||
:return: 业务表字段列表信息对象
|
:return: 业务表字段列表信息对象
|
||||||
"""
|
"""
|
||||||
query_sql = """
|
if DataBaseConfig.db_type == 'postgresql':
|
||||||
select
|
query_sql = """
|
||||||
column_name as column_name,
|
select
|
||||||
case
|
column_name, is_required, is_pk, sort, column_comment, is_increment, column_type
|
||||||
when is_nullable = 'no' and column_key != 'PRI' then '1'
|
from
|
||||||
else '0'
|
list_column
|
||||||
end as is_required,
|
where
|
||||||
case
|
table_name = :table_name
|
||||||
when column_key = 'PRI' then '1'
|
"""
|
||||||
else '0'
|
else:
|
||||||
end as is_pk,
|
query_sql = """
|
||||||
ordinal_position as sort,
|
select
|
||||||
column_comment as column_comment,
|
column_name as column_name,
|
||||||
case
|
case
|
||||||
when extra = 'auto_increment' then '1'
|
when is_nullable = 'no' and column_key != 'PRI' then '1'
|
||||||
else '0'
|
else '0'
|
||||||
end as is_increment,
|
end as is_required,
|
||||||
column_type as column_type
|
case
|
||||||
from
|
when column_key = 'PRI' then '1'
|
||||||
information_schema.columns
|
else '0'
|
||||||
where
|
end as is_pk,
|
||||||
table_schema = (select database())
|
ordinal_position as sort,
|
||||||
and table_name = :table_name
|
column_comment as column_comment,
|
||||||
order by
|
case
|
||||||
ordinal_position
|
when extra = 'auto_increment' then '1'
|
||||||
"""
|
else '0'
|
||||||
|
end as is_increment,
|
||||||
|
column_type as column_type
|
||||||
|
from
|
||||||
|
information_schema.columns
|
||||||
|
where
|
||||||
|
table_schema = (select database())
|
||||||
|
and table_name = :table_name
|
||||||
|
order by
|
||||||
|
ordinal_position
|
||||||
|
"""
|
||||||
query = text(query_sql).bindparams(table_name=table_name)
|
query = text(query_sql).bindparams(table_name=table_name)
|
||||||
gen_db_table_columns = (await db.execute(query)).fetchall()
|
gen_db_table_columns = (await db.execute(query)).fetchall()
|
||||||
|
|
||||||
|
@@ -1,3 +1,27 @@
|
|||||||
|
{% if dbType == 'postgresql' %}
|
||||||
|
-- 菜单 SQL
|
||||||
|
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
|
||||||
|
values('${functionName}', '${parentMenuId}', '1', '${businessName}', '${moduleName}/${businessName}/index', 1, 0, 'C', '0', '0', '${permissionPrefix}:list', '#', 'admin', current_timestamp, '', null, '${functionName}菜单');
|
||||||
|
|
||||||
|
-- 按钮父菜单ID
|
||||||
|
select max(menu_id) from sys_menu;
|
||||||
|
|
||||||
|
-- 按钮 SQL
|
||||||
|
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
|
||||||
|
values('${functionName}查询', max(menu_id), '1', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:query', '#', 'admin', current_timestamp, '', null, '');
|
||||||
|
|
||||||
|
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
|
||||||
|
values('${functionName}新增', max(menu_id), '2', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:add', '#', 'admin', current_timestamp, '', null, '');
|
||||||
|
|
||||||
|
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
|
||||||
|
values('${functionName}修改', max(menu_id), '3', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:edit', '#', 'admin', current_timestamp, '', null, '');
|
||||||
|
|
||||||
|
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
|
||||||
|
values('${functionName}删除', max(menu_id), '4', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:remove', '#', 'admin', current_timestamp, '', null, '');
|
||||||
|
|
||||||
|
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
|
||||||
|
values('${functionName}导出', max(menu_id), '5', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:export', '#', 'admin', current_timestamp, '', null, '');
|
||||||
|
{% else %}
|
||||||
-- 菜单 SQL
|
-- 菜单 SQL
|
||||||
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
|
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
|
||||||
values('{{ functionName }}', '{{ parentMenuId }}', '1', '{{ businessName }}', '{{ moduleName }}/{{ businessName }}/index', 1, 0, 'C', '0', '0', '{{ permissionPrefix }}:list', '#', 'admin', sysdate(), '', null, '{{ functionName }}菜单');
|
values('{{ functionName }}', '{{ parentMenuId }}', '1', '{{ businessName }}', '{{ moduleName }}/{{ businessName }}/index', 1, 0, 'C', '0', '0', '{{ permissionPrefix }}:list', '#', 'admin', sysdate(), '', null, '{{ functionName }}菜单');
|
||||||
@@ -19,4 +43,5 @@ insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame
|
|||||||
values('{{ functionName }}删除', @parentId, '4', '#', '', 1, 0, 'F', '0', '0', '{{ permissionPrefix }}:remove', '#', 'admin', sysdate(), '', null, '');
|
values('{{ functionName }}删除', @parentId, '4', '#', '', 1, 0, 'F', '0', '0', '{{ permissionPrefix }}:remove', '#', 'admin', sysdate(), '', null, '');
|
||||||
|
|
||||||
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
|
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
|
||||||
values('{{ functionName }}导出', @parentId, '5', '#', '', 1, 0, 'F', '0', '0', '{{ permissionPrefix }}:export', '#', 'admin', sysdate(), '', null, '');
|
values('{{ functionName }}导出', @parentId, '5', '#', '', 1, 0, 'F', '0', '0', '{{ permissionPrefix }}:export', '#', 'admin', sysdate(), '', null, '');
|
||||||
|
{% endif %}
|
@@ -909,7 +909,7 @@ comment on table gen_table is '代码生成业务表';
|
|||||||
drop table if exists gen_table_column;
|
drop table if exists gen_table_column;
|
||||||
create table gen_table_column (
|
create table gen_table_column (
|
||||||
column_id bigserial not null,
|
column_id bigserial not null,
|
||||||
table_id varchar(64),
|
table_id bigint,
|
||||||
column_name varchar(200),
|
column_name varchar(200),
|
||||||
column_comment varchar(500),
|
column_comment varchar(500),
|
||||||
column_type varchar(100),
|
column_type varchar(100),
|
||||||
@@ -981,18 +981,18 @@ SELECT c.relname
|
|||||||
a.attname AS column_name,
|
a.attname AS column_name,
|
||||||
d.description AS column_comment,
|
d.description AS column_comment,
|
||||||
CASE
|
CASE
|
||||||
WHEN a.attnotnull AND con.conname IS NULL THEN 1
|
WHEN a.attnotnull AND con.conname IS NULL THEN '1'
|
||||||
ELSE 0
|
ELSE '0'
|
||||||
END AS is_required,
|
END AS is_required,
|
||||||
CASE
|
CASE
|
||||||
WHEN con.conname IS NOT NULL THEN 1
|
WHEN con.conname IS NOT NULL THEN '1'
|
||||||
ELSE 0
|
ELSE '0'
|
||||||
END AS is_pk,
|
END AS is_pk,
|
||||||
a.attnum AS sort,
|
a.attnum AS sort,
|
||||||
CASE
|
CASE
|
||||||
WHEN "position"(pg_get_expr(ad.adbin, ad.adrelid), ((c.relname::text || '_'::text) || a.attname
|
WHEN "position"(pg_get_expr(ad.adbin, ad.adrelid), ((c.relname::text || '_'::text) || a.attname
|
||||||
::text) || '_seq'::text) > 0 THEN 1
|
::text) || '_seq'::text) > 0 THEN '1'
|
||||||
ELSE 0
|
ELSE '0'
|
||||||
END AS is_increment,
|
END AS is_increment,
|
||||||
btrim(
|
btrim(
|
||||||
CASE
|
CASE
|
||||||
|
@@ -4,6 +4,7 @@ from datetime import datetime
|
|||||||
from jinja2 import Environment, FileSystemLoader
|
from jinja2 import Environment, FileSystemLoader
|
||||||
from typing import Dict, List, Set
|
from typing import Dict, List, Set
|
||||||
from config.constant import GenConstant
|
from config.constant import GenConstant
|
||||||
|
from config.env import DataBaseConfig
|
||||||
from module_generator.entity.vo.gen_vo import GenTableModel, GenTableColumnModel
|
from module_generator.entity.vo.gen_vo import GenTableModel, GenTableColumnModel
|
||||||
from utils.common_util import CamelCaseUtil, SnakeCaseUtil
|
from utils.common_util import CamelCaseUtil, SnakeCaseUtil
|
||||||
from utils.string_util import StringUtil
|
from utils.string_util import StringUtil
|
||||||
@@ -86,6 +87,7 @@ class TemplateUtils:
|
|||||||
'columns': gen_table.columns,
|
'columns': gen_table.columns,
|
||||||
'table': gen_table,
|
'table': gen_table,
|
||||||
'dicts': cls.get_dicts(gen_table),
|
'dicts': cls.get_dicts(gen_table),
|
||||||
|
'dbType': DataBaseConfig.db_type,
|
||||||
}
|
}
|
||||||
|
|
||||||
# 设置菜单、树形结构、子表的上下文
|
# 设置菜单、树形结构、子表的上下文
|
||||||
|
Reference in New Issue
Block a user