Skip to content

Commit c0b4f84

Browse files
committed
Update the primary database to postgresql
1 parent 0be5685 commit c0b4f84

File tree

21 files changed

+219
-214
lines changed

21 files changed

+219
-214
lines changed

backend/.env.example

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
# Env
22
ENVIRONMENT='dev'
33
# Database
4-
DATABASE_TYPE='mysql'
4+
DATABASE_TYPE='postgresql'
55
DATABASE_HOST='127.0.0.1'
6-
DATABASE_PORT=3306
7-
DATABASE_USER='root'
6+
DATABASE_PORT=5432
7+
DATABASE_USER='postgres'
88
DATABASE_PASSWORD='123456'
99
# Redis
1010
REDIS_HOST='127.0.0.1'

backend/app/__init__.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,15 @@ def get_app_models() -> list[type]:
1818
apps.append(d)
1919

2020
objs = []
21-
2221
for app in apps:
2322
module_path = f'backend.app.{app}.model'
2423
obj = get_model_object(module_path)
2524
if obj:
2625
objs.append(obj)
2726

27+
print(apps)
28+
print(objs)
29+
2830
return objs
2931

3032

backend/app/admin/model/data_rule.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44

55
from typing import TYPE_CHECKING
66

7-
from sqlalchemy import String
7+
import sqlalchemy as sa
8+
89
from sqlalchemy.orm import Mapped, mapped_column, relationship
910

1011
from backend.app.admin.model.m2m import sys_data_scope_rule
@@ -20,14 +21,14 @@ class DataRule(Base):
2021
__tablename__ = 'sys_data_rule'
2122

2223
id: Mapped[id_key] = mapped_column(init=False)
23-
name: Mapped[str] = mapped_column(String(500), unique=True, comment='名称')
24-
model: Mapped[str] = mapped_column(String(50), comment='SQLA 模型名,对应 DATA_PERMISSION_MODELS 键名')
25-
column: Mapped[str] = mapped_column(String(20), comment='模型字段名')
24+
name: Mapped[str] = mapped_column(sa.String(500), unique=True, comment='名称')
25+
model: Mapped[str] = mapped_column(sa.String(50), comment='SQLA 模型名,对应 DATA_PERMISSION_MODELS 键名')
26+
column: Mapped[str] = mapped_column(sa.String(20), comment='模型字段名')
2627
operator: Mapped[int] = mapped_column(comment='运算符(0:and、1:or)')
2728
expression: Mapped[int] = mapped_column(
2829
comment='表达式(0:==、1:!=、2:>、3:>=、4:<、5:<=、6:in、7:not_in)'
2930
)
30-
value: Mapped[str] = mapped_column(String(255), comment='规则值')
31+
value: Mapped[str] = mapped_column(sa.String(255), comment='规则值')
3132

3233
# 数据范围规则多对多
3334
scopes: Mapped[list[DataScope]] = relationship(init=False, secondary=sys_data_scope_rule, back_populates='rules')

backend/app/admin/model/data_scope.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44

55
from typing import TYPE_CHECKING
66

7-
from sqlalchemy import String
7+
import sqlalchemy as sa
8+
89
from sqlalchemy.orm import Mapped, mapped_column, relationship
910

1011
from backend.app.admin.model.m2m import sys_data_scope_rule, sys_role_data_scope
@@ -20,7 +21,7 @@ class DataScope(Base):
2021
__tablename__ = 'sys_data_scope'
2122

2223
id: Mapped[id_key] = mapped_column(init=False)
23-
name: Mapped[str] = mapped_column(String(50), unique=True, comment='名称')
24+
name: Mapped[str] = mapped_column(sa.String(50), unique=True, comment='名称')
2425
status: Mapped[int] = mapped_column(default=1, comment='状态(0停用 1正常)')
2526

2627
# 数据范围规则多对多

backend/app/admin/model/dept.py

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,9 @@
44

55
from typing import TYPE_CHECKING, Optional
66

7-
from sqlalchemy import BigInteger, Boolean, ForeignKey, String
8-
from sqlalchemy.dialects.postgresql import INTEGER
7+
import sqlalchemy as sa
8+
9+
from sqlalchemy.dialects.mysql import TINYINT
910
from sqlalchemy.orm import Mapped, mapped_column, relationship
1011

1112
from backend.common.model import Base, id_key
@@ -20,19 +21,19 @@ class Dept(Base):
2021
__tablename__ = 'sys_dept'
2122

2223
id: Mapped[id_key] = mapped_column(init=False)
23-
name: Mapped[str] = mapped_column(String(50), comment='部门名称')
24+
name: Mapped[str] = mapped_column(sa.String(50), comment='部门名称')
2425
sort: Mapped[int] = mapped_column(default=0, comment='排序')
25-
leader: Mapped[str | None] = mapped_column(String(20), default=None, comment='负责人')
26-
phone: Mapped[str | None] = mapped_column(String(11), default=None, comment='手机')
27-
email: Mapped[str | None] = mapped_column(String(50), default=None, comment='邮箱')
26+
leader: Mapped[str | None] = mapped_column(sa.String(20), default=None, comment='负责人')
27+
phone: Mapped[str | None] = mapped_column(sa.String(11), default=None, comment='手机')
28+
email: Mapped[str | None] = mapped_column(sa.String(50), default=None, comment='邮箱')
2829
status: Mapped[int] = mapped_column(default=1, comment='部门状态(0停用 1正常)')
2930
del_flag: Mapped[bool] = mapped_column(
30-
Boolean().with_variant(INTEGER, 'postgresql'), default=False, comment='删除标志(0删除 1存在)'
31+
sa.INTEGER().with_variant(TINYINT, 'mysql'), default=False, comment='删除标志(0删除 1存在)'
3132
)
3233

3334
# 父级部门一对多
3435
parent_id: Mapped[int | None] = mapped_column(
35-
BigInteger, ForeignKey('sys_dept.id', ondelete='SET NULL'), default=None, index=True, comment='父部门ID'
36+
sa.BigInteger, sa.ForeignKey('sys_dept.id', ondelete='SET NULL'), default=None, index=True, comment='父部门ID'
3637
)
3738
parent: Mapped[Optional['Dept']] = relationship(init=False, back_populates='children', remote_side=[id])
3839
children: Mapped[Optional[list['Dept']]] = relationship(init=False, back_populates='parent')

backend/app/admin/model/login_log.py

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22
# -*- coding: utf-8 -*-
33
from datetime import datetime
44

5-
from sqlalchemy import String
5+
import sqlalchemy as sa
6+
67
from sqlalchemy.dialects.mysql import LONGTEXT
7-
from sqlalchemy.dialects.postgresql import TEXT
88
from sqlalchemy.orm import Mapped, mapped_column
99

1010
from backend.common.model import DataClassBase, TimeZone, id_key
@@ -17,18 +17,18 @@ class LoginLog(DataClassBase):
1717
__tablename__ = 'sys_login_log'
1818

1919
id: Mapped[id_key] = mapped_column(init=False)
20-
user_uuid: Mapped[str] = mapped_column(String(50), comment='用户UUID')
21-
username: Mapped[str] = mapped_column(String(20), comment='用户名')
20+
user_uuid: Mapped[str] = mapped_column(sa.String(50), comment='用户UUID')
21+
username: Mapped[str] = mapped_column(sa.String(20), comment='用户名')
2222
status: Mapped[int] = mapped_column(insert_default=0, comment='登录状态(0失败 1成功)')
23-
ip: Mapped[str] = mapped_column(String(50), comment='登录IP地址')
24-
country: Mapped[str | None] = mapped_column(String(50), comment='国家')
25-
region: Mapped[str | None] = mapped_column(String(50), comment='地区')
26-
city: Mapped[str | None] = mapped_column(String(50), comment='城市')
27-
user_agent: Mapped[str] = mapped_column(String(255), comment='请求头')
28-
os: Mapped[str | None] = mapped_column(String(50), comment='操作系统')
29-
browser: Mapped[str | None] = mapped_column(String(50), comment='浏览器')
30-
device: Mapped[str | None] = mapped_column(String(50), comment='设备')
31-
msg: Mapped[str] = mapped_column(LONGTEXT().with_variant(TEXT, 'postgresql'), comment='提示消息')
23+
ip: Mapped[str] = mapped_column(sa.String(50), comment='登录IP地址')
24+
country: Mapped[str | None] = mapped_column(sa.String(50), comment='国家')
25+
region: Mapped[str | None] = mapped_column(sa.String(50), comment='地区')
26+
city: Mapped[str | None] = mapped_column(sa.String(50), comment='城市')
27+
user_agent: Mapped[str] = mapped_column(sa.String(255), comment='请求头')
28+
os: Mapped[str | None] = mapped_column(sa.String(50), comment='操作系统')
29+
browser: Mapped[str | None] = mapped_column(sa.String(50), comment='浏览器')
30+
device: Mapped[str | None] = mapped_column(sa.String(50), comment='设备')
31+
msg: Mapped[str] = mapped_column(sa.TEXT().with_variant(LONGTEXT, 'mysql'), comment='提示消息')
3232
login_time: Mapped[datetime] = mapped_column(TimeZone, comment='登录时间')
3333
created_time: Mapped[datetime] = mapped_column(
3434
TimeZone, init=False, default_factory=timezone.now, comment='创建时间'

backend/app/admin/model/m2m.py

Lines changed: 33 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,64 @@
11
#!/usr/bin/env python3
22
# -*- coding: utf-8 -*-
3-
from sqlalchemy import BigInteger, Column, ForeignKey, Table
3+
import sqlalchemy as sa
44

55
from backend.common.model import MappedBase
66

7-
sys_user_role = Table(
7+
sys_user_role = sa.Table(
88
'sys_user_role',
99
MappedBase.metadata,
10-
Column('id', BigInteger, primary_key=True, unique=True, index=True, autoincrement=True, comment='主键ID'),
11-
Column('user_id', BigInteger, ForeignKey('sys_user.id', ondelete='CASCADE'), primary_key=True, comment='用户ID'),
12-
Column('role_id', BigInteger, ForeignKey('sys_role.id', ondelete='CASCADE'), primary_key=True, comment='角色ID'),
10+
sa.Column('id', sa.BigInteger, primary_key=True, unique=True, index=True, autoincrement=True, comment='主键ID'),
11+
sa.Column(
12+
'user_id', sa.BigInteger, sa.ForeignKey('sys_user.id', ondelete='CASCADE'), primary_key=True, comment='用户ID'
13+
),
14+
sa.Column(
15+
'role_id', sa.BigInteger, sa.ForeignKey('sys_role.id', ondelete='CASCADE'), primary_key=True, comment='角色ID'
16+
),
1317
)
1418

15-
sys_role_menu = Table(
19+
sys_role_menu = sa.Table(
1620
'sys_role_menu',
1721
MappedBase.metadata,
18-
Column('id', BigInteger, primary_key=True, unique=True, index=True, autoincrement=True, comment='主键ID'),
19-
Column('role_id', BigInteger, ForeignKey('sys_role.id', ondelete='CASCADE'), primary_key=True, comment='角色ID'),
20-
Column('menu_id', BigInteger, ForeignKey('sys_menu.id', ondelete='CASCADE'), primary_key=True, comment='菜单ID'),
22+
sa.Column('id', sa.BigInteger, primary_key=True, unique=True, index=True, autoincrement=True, comment='主键ID'),
23+
sa.Column(
24+
'role_id', sa.BigInteger, sa.ForeignKey('sys_role.id', ondelete='CASCADE'), primary_key=True, comment='角色ID'
25+
),
26+
sa.Column(
27+
'menu_id', sa.BigInteger, sa.ForeignKey('sys_menu.id', ondelete='CASCADE'), primary_key=True, comment='菜单ID'
28+
),
2129
)
2230

23-
sys_role_data_scope = Table(
31+
sys_role_data_scope = sa.Table(
2432
'sys_role_data_scope',
2533
MappedBase.metadata,
26-
Column('id', BigInteger, primary_key=True, unique=True, index=True, autoincrement=True, comment='主键 ID'),
27-
Column('role_id', BigInteger, ForeignKey('sys_role.id', ondelete='CASCADE'), primary_key=True, comment='角色 ID'),
28-
Column(
34+
sa.Column('id', sa.BigInteger, primary_key=True, unique=True, index=True, autoincrement=True, comment='主键 ID'),
35+
sa.Column(
36+
'role_id', sa.BigInteger, sa.ForeignKey('sys_role.id', ondelete='CASCADE'), primary_key=True, comment='角色 ID'
37+
),
38+
sa.Column(
2939
'data_scope_id',
30-
BigInteger,
31-
ForeignKey('sys_data_scope.id', ondelete='CASCADE'),
40+
sa.BigInteger,
41+
sa.ForeignKey('sys_data_scope.id', ondelete='CASCADE'),
3242
primary_key=True,
3343
comment='数据范围 ID',
3444
),
3545
)
3646

37-
sys_data_scope_rule = Table(
47+
sys_data_scope_rule = sa.Table(
3848
'sys_data_scope_rule',
3949
MappedBase.metadata,
40-
Column('id', BigInteger, primary_key=True, unique=True, index=True, autoincrement=True, comment='主键ID'),
41-
Column(
50+
sa.Column('id', sa.BigInteger, primary_key=True, unique=True, index=True, autoincrement=True, comment='主键ID'),
51+
sa.Column(
4252
'data_scope_id',
43-
BigInteger,
44-
ForeignKey('sys_data_scope.id', ondelete='CASCADE'),
53+
sa.BigInteger,
54+
sa.ForeignKey('sys_data_scope.id', ondelete='CASCADE'),
4555
primary_key=True,
4656
comment='数据范围 ID',
4757
),
48-
Column(
58+
sa.Column(
4959
'data_rule_id',
50-
BigInteger,
51-
ForeignKey('sys_data_rule.id', ondelete='CASCADE'),
60+
sa.BigInteger,
61+
sa.ForeignKey('sys_data_rule.id', ondelete='CASCADE'),
5262
primary_key=True,
5363
comment='数据规则 ID',
5464
),

backend/app/admin/model/menu.py

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@
44

55
from typing import TYPE_CHECKING, Optional
66

7-
from sqlalchemy import BigInteger, ForeignKey, String
7+
import sqlalchemy as sa
8+
89
from sqlalchemy.dialects.mysql import LONGTEXT
9-
from sqlalchemy.dialects.postgresql import TEXT
1010
from sqlalchemy.orm import Mapped, mapped_column, relationship
1111

1212
from backend.app.admin.model.m2m import sys_role_menu
@@ -22,27 +22,25 @@ class Menu(Base):
2222
__tablename__ = 'sys_menu'
2323

2424
id: Mapped[id_key] = mapped_column(init=False)
25-
title: Mapped[str] = mapped_column(String(50), comment='菜单标题')
26-
name: Mapped[str] = mapped_column(String(50), comment='菜单名称')
27-
path: Mapped[str | None] = mapped_column(String(200), comment='路由地址')
25+
title: Mapped[str] = mapped_column(sa.String(50), comment='菜单标题')
26+
name: Mapped[str] = mapped_column(sa.String(50), comment='菜单名称')
27+
path: Mapped[str | None] = mapped_column(sa.String(200), comment='路由地址')
2828
sort: Mapped[int] = mapped_column(default=0, comment='排序')
29-
icon: Mapped[str | None] = mapped_column(String(100), default=None, comment='菜单图标')
29+
icon: Mapped[str | None] = mapped_column(sa.String(100), default=None, comment='菜单图标')
3030
type: Mapped[int] = mapped_column(default=0, comment='菜单类型(0目录 1菜单 2按钮 3内嵌 4外链)')
31-
component: Mapped[str | None] = mapped_column(String(255), default=None, comment='组件路径')
32-
perms: Mapped[str | None] = mapped_column(String(100), default=None, comment='权限标识')
31+
component: Mapped[str | None] = mapped_column(sa.String(255), default=None, comment='组件路径')
32+
perms: Mapped[str | None] = mapped_column(sa.String(100), default=None, comment='权限标识')
3333
status: Mapped[int] = mapped_column(default=1, comment='菜单状态(0停用 1正常)')
3434
display: Mapped[int] = mapped_column(default=1, comment='是否显示(0否 1是)')
3535
cache: Mapped[int] = mapped_column(default=1, comment='是否缓存(0否 1是)')
3636
link: Mapped[str | None] = mapped_column(
37-
LONGTEXT().with_variant(TEXT, 'postgresql'), default=None, comment='外链地址'
38-
)
39-
remark: Mapped[str | None] = mapped_column(
40-
LONGTEXT().with_variant(TEXT, 'postgresql'), default=None, comment='备注'
37+
sa.TEXT().with_variant(LONGTEXT, 'mysql'), default=None, comment='外链地址'
4138
)
39+
remark: Mapped[str | None] = mapped_column(sa.TEXT().with_variant(LONGTEXT, 'mysql'), default=None, comment='备注')
4240

4341
# 父级菜单一对多
4442
parent_id: Mapped[int | None] = mapped_column(
45-
BigInteger, ForeignKey('sys_menu.id', ondelete='SET NULL'), default=None, index=True, comment='父菜单ID'
43+
sa.BigInteger, sa.ForeignKey('sys_menu.id', ondelete='SET NULL'), default=None, index=True, comment='父菜单ID'
4644
)
4745
parent: Mapped[Optional['Menu']] = relationship(init=False, back_populates='children', remote_side=[id])
4846
children: Mapped[Optional[list['Menu']]] = relationship(init=False, back_populates='parent')

backend/app/admin/model/opera_log.py

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22
# -*- coding: utf-8 -*-
33
from datetime import datetime
44

5-
from sqlalchemy import String
6-
from sqlalchemy.dialects.mysql import JSON, LONGTEXT
7-
from sqlalchemy.dialects.postgresql import TEXT
5+
import sqlalchemy as sa
6+
7+
from sqlalchemy.dialects.mysql import LONGTEXT
88
from sqlalchemy.orm import Mapped, mapped_column
99

1010
from backend.common.model import DataClassBase, TimeZone, id_key
@@ -17,23 +17,23 @@ class OperaLog(DataClassBase):
1717
__tablename__ = 'sys_opera_log'
1818

1919
id: Mapped[id_key] = mapped_column(init=False)
20-
trace_id: Mapped[str] = mapped_column(String(32), comment='请求跟踪 ID')
21-
username: Mapped[str | None] = mapped_column(String(20), comment='用户名')
22-
method: Mapped[str] = mapped_column(String(20), comment='请求类型')
23-
title: Mapped[str] = mapped_column(String(255), comment='操作模块')
24-
path: Mapped[str] = mapped_column(String(500), comment='请求路径')
25-
ip: Mapped[str] = mapped_column(String(50), comment='IP地址')
26-
country: Mapped[str | None] = mapped_column(String(50), comment='国家')
27-
region: Mapped[str | None] = mapped_column(String(50), comment='地区')
28-
city: Mapped[str | None] = mapped_column(String(50), comment='城市')
29-
user_agent: Mapped[str] = mapped_column(String(255), comment='请求头')
30-
os: Mapped[str | None] = mapped_column(String(50), comment='操作系统')
31-
browser: Mapped[str | None] = mapped_column(String(50), comment='浏览器')
32-
device: Mapped[str | None] = mapped_column(String(50), comment='设备')
33-
args: Mapped[str | None] = mapped_column(JSON(), comment='请求参数')
20+
trace_id: Mapped[str] = mapped_column(sa.String(32), comment='请求跟踪 ID')
21+
username: Mapped[str | None] = mapped_column(sa.String(20), comment='用户名')
22+
method: Mapped[str] = mapped_column(sa.String(20), comment='请求类型')
23+
title: Mapped[str] = mapped_column(sa.String(255), comment='操作模块')
24+
path: Mapped[str] = mapped_column(sa.String(500), comment='请求路径')
25+
ip: Mapped[str] = mapped_column(sa.String(50), comment='IP地址')
26+
country: Mapped[str | None] = mapped_column(sa.String(50), comment='国家')
27+
region: Mapped[str | None] = mapped_column(sa.String(50), comment='地区')
28+
city: Mapped[str | None] = mapped_column(sa.String(50), comment='城市')
29+
user_agent: Mapped[str] = mapped_column(sa.String(255), comment='请求头')
30+
os: Mapped[str | None] = mapped_column(sa.String(50), comment='操作系统')
31+
browser: Mapped[str | None] = mapped_column(sa.String(50), comment='浏览器')
32+
device: Mapped[str | None] = mapped_column(sa.String(50), comment='设备')
33+
args: Mapped[str | None] = mapped_column(sa.JSON(), comment='请求参数')
3434
status: Mapped[int] = mapped_column(comment='操作状态(0异常 1正常)')
35-
code: Mapped[str] = mapped_column(String(20), insert_default='200', comment='操作状态码')
36-
msg: Mapped[str | None] = mapped_column(LONGTEXT().with_variant(TEXT, 'postgresql'), comment='提示消息')
35+
code: Mapped[str] = mapped_column(sa.String(20), insert_default='200', comment='操作状态码')
36+
msg: Mapped[str | None] = mapped_column(sa.TEXT().with_variant(LONGTEXT, 'mysql'), comment='提示消息')
3737
cost_time: Mapped[float] = mapped_column(insert_default=0.0, comment='请求耗时(ms)')
3838
opera_time: Mapped[datetime] = mapped_column(TimeZone, comment='操作时间')
3939
created_time: Mapped[datetime] = mapped_column(

backend/app/admin/model/role.py

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@
44

55
from typing import TYPE_CHECKING
66

7-
from sqlalchemy import Boolean, String
8-
from sqlalchemy.dialects.mysql import LONGTEXT
9-
from sqlalchemy.dialects.postgresql import INTEGER, TEXT
7+
import sqlalchemy as sa
8+
9+
from sqlalchemy.dialects.mysql import LONGTEXT, TINYINT
1010
from sqlalchemy.orm import Mapped, mapped_column, relationship
1111

1212
from backend.app.admin.model.m2m import sys_role_data_scope, sys_role_menu, sys_user_role
@@ -22,14 +22,12 @@ class Role(Base):
2222
__tablename__ = 'sys_role'
2323

2424
id: Mapped[id_key] = mapped_column(init=False)
25-
name: Mapped[str] = mapped_column(String(20), unique=True, comment='角色名称')
25+
name: Mapped[str] = mapped_column(sa.String(20), unique=True, comment='角色名称')
2626
status: Mapped[int] = mapped_column(default=1, comment='角色状态(0停用 1正常)')
2727
is_filter_scopes: Mapped[bool] = mapped_column(
28-
Boolean().with_variant(INTEGER, 'postgresql'), default=True, comment='过滤数据权限(0否 1是)'
29-
)
30-
remark: Mapped[str | None] = mapped_column(
31-
LONGTEXT().with_variant(TEXT, 'postgresql'), default=None, comment='备注'
28+
sa.INTEGER().with_variant(TINYINT, 'mysql'), default=True, comment='过滤数据权限(0否 1是)'
3229
)
30+
remark: Mapped[str | None] = mapped_column(sa.TEXT().with_variant(LONGTEXT, 'mysql'), default=None, comment='备注')
3331

3432
# 角色用户多对多
3533
users: Mapped[list[User]] = relationship(init=False, secondary=sys_user_role, back_populates='roles')

0 commit comments

Comments
 (0)