feat: 代码生成初步适配pg数据库

This commit is contained in:
insistence
2025-02-17 23:06:22 +08:00
parent 2b474ddb35
commit 15686b44ad
4 changed files with 136 additions and 63 deletions

View File

@@ -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()

View File

@@ -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 }}菜单');
@@ -20,3 +44,4 @@ values('{{ functionName }}删除', @parentId, '4', '#', '', 1, 0, 'F', '0', '0'
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 %}

View File

@@ -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

View File

@@ -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,
} }
# 设置菜单、树形结构、子表的上下文 # 设置菜单、树形结构、子表的上下文