Skip to content

Commit b28a4d7

Browse files
authored
Update the primary database to postgresql (#829)
* Update the primary database to postgresql * Delete the prints * Fix lint * Update models in code generation * Delete print * Fix the salt column type
1 parent 27383e4 commit b28a4d7

File tree

20 files changed

+218
-273
lines changed

20 files changed

+218
-273
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: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ def get_app_models() -> list[type]:
1212
apps = [d for d in list_dirs if os.path.isdir(os.path.join(app_path, d)) and d != '__pycache__']
1313

1414
objs = []
15-
1615
for app in apps:
1716
module_path = f'backend.app.{app}.model'
1817
obj = get_model_objects(module_path)

backend/app/admin/model/data_rule.py

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

33
from typing import TYPE_CHECKING
44

5-
from sqlalchemy import String
5+
import sqlalchemy as sa
6+
67
from sqlalchemy.orm import Mapped, mapped_column, relationship
78

89
from backend.app.admin.model.m2m import sys_data_scope_rule
@@ -18,14 +19,14 @@ class DataRule(Base):
1819
__tablename__ = 'sys_data_rule'
1920

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

3031
# 数据范围规则多对多
3132
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
@@ -2,7 +2,8 @@
22

33
from typing import TYPE_CHECKING
44

5-
from sqlalchemy import String
5+
import sqlalchemy as sa
6+
67
from sqlalchemy.orm import Mapped, mapped_column, relationship
78

89
from backend.app.admin.model.m2m import sys_data_scope_rule, sys_role_data_scope
@@ -18,7 +19,7 @@ class DataScope(Base):
1819
__tablename__ = 'sys_data_scope'
1920

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

2425
# 数据范围规则多对多

backend/app/admin/model/dept.py

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@
22

33
from typing import TYPE_CHECKING
44

5-
from sqlalchemy import BigInteger, Boolean, ForeignKey, String
6-
from sqlalchemy.dialects.postgresql import INTEGER
5+
import sqlalchemy as sa
6+
7+
from sqlalchemy.dialects.mysql import TINYINT
78
from sqlalchemy.orm import Mapped, mapped_column, relationship
89

910
from backend.common.model import Base, id_key
@@ -18,25 +19,19 @@ class Dept(Base):
1819
__tablename__ = 'sys_dept'
1920

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

3332
# 父级部门一对多
3433
parent_id: Mapped[int | None] = mapped_column(
35-
BigInteger,
36-
ForeignKey('sys_dept.id', ondelete='SET NULL'),
37-
default=None,
38-
index=True,
39-
comment='父部门ID',
34+
sa.BigInteger, sa.ForeignKey('sys_dept.id', ondelete='SET NULL'), default=None, index=True, comment='父部门ID'
4035
)
4136
parent: Mapped[Dept | None] = relationship(init=False, back_populates='children', remote_side=[id])
4237
children: Mapped[list[Dept] | None] = 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
@@ -1,8 +1,8 @@
11
from datetime import datetime
22

3-
from sqlalchemy import String
3+
import sqlalchemy as sa
4+
45
from sqlalchemy.dialects.mysql import LONGTEXT
5-
from sqlalchemy.dialects.postgresql import TEXT
66
from sqlalchemy.orm import Mapped, mapped_column
77

88
from backend.common.model import DataClassBase, TimeZone, id_key
@@ -15,18 +15,18 @@ class LoginLog(DataClassBase):
1515
__tablename__ = 'sys_login_log'
1616

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

backend/app/admin/model/m2m.py

Lines changed: 33 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,62 @@
1-
from sqlalchemy import BigInteger, Column, ForeignKey, Table
1+
import sqlalchemy as sa
22

33
from backend.common.model import MappedBase
44

5-
sys_user_role = Table(
5+
sys_user_role = sa.Table(
66
'sys_user_role',
77
MappedBase.metadata,
8-
Column('id', BigInteger, primary_key=True, unique=True, index=True, autoincrement=True, comment='主键ID'),
9-
Column('user_id', BigInteger, ForeignKey('sys_user.id', ondelete='CASCADE'), primary_key=True, comment='用户ID'),
10-
Column('role_id', BigInteger, ForeignKey('sys_role.id', ondelete='CASCADE'), primary_key=True, comment='角色ID'),
8+
sa.Column('id', sa.BigInteger, primary_key=True, unique=True, index=True, autoincrement=True, comment='主键ID'),
9+
sa.Column(
10+
'user_id', sa.BigInteger, sa.ForeignKey('sys_user.id', ondelete='CASCADE'), primary_key=True, comment='用户ID'
11+
),
12+
sa.Column(
13+
'role_id', sa.BigInteger, sa.ForeignKey('sys_role.id', ondelete='CASCADE'), primary_key=True, comment='角色ID'
14+
),
1115
)
1216

13-
sys_role_menu = Table(
17+
sys_role_menu = sa.Table(
1418
'sys_role_menu',
1519
MappedBase.metadata,
16-
Column('id', BigInteger, primary_key=True, unique=True, index=True, autoincrement=True, comment='主键ID'),
17-
Column('role_id', BigInteger, ForeignKey('sys_role.id', ondelete='CASCADE'), primary_key=True, comment='角色ID'),
18-
Column('menu_id', BigInteger, ForeignKey('sys_menu.id', ondelete='CASCADE'), primary_key=True, comment='菜单ID'),
20+
sa.Column('id', sa.BigInteger, primary_key=True, unique=True, index=True, autoincrement=True, comment='主键ID'),
21+
sa.Column(
22+
'role_id', sa.BigInteger, sa.ForeignKey('sys_role.id', ondelete='CASCADE'), primary_key=True, comment='角色ID'
23+
),
24+
sa.Column(
25+
'menu_id', sa.BigInteger, sa.ForeignKey('sys_menu.id', ondelete='CASCADE'), primary_key=True, comment='菜单ID'
26+
),
1927
)
2028

21-
sys_role_data_scope = Table(
29+
sys_role_data_scope = sa.Table(
2230
'sys_role_data_scope',
2331
MappedBase.metadata,
24-
Column('id', BigInteger, primary_key=True, unique=True, index=True, autoincrement=True, comment='主键 ID'),
25-
Column('role_id', BigInteger, ForeignKey('sys_role.id', ondelete='CASCADE'), primary_key=True, comment='角色 ID'),
26-
Column(
32+
sa.Column('id', sa.BigInteger, primary_key=True, unique=True, index=True, autoincrement=True, comment='主键 ID'),
33+
sa.Column(
34+
'role_id', sa.BigInteger, sa.ForeignKey('sys_role.id', ondelete='CASCADE'), primary_key=True, comment='角色 ID'
35+
),
36+
sa.Column(
2737
'data_scope_id',
28-
BigInteger,
29-
ForeignKey('sys_data_scope.id', ondelete='CASCADE'),
38+
sa.BigInteger,
39+
sa.ForeignKey('sys_data_scope.id', ondelete='CASCADE'),
3040
primary_key=True,
3141
comment='数据范围 ID',
3242
),
3343
)
3444

35-
sys_data_scope_rule = Table(
45+
sys_data_scope_rule = sa.Table(
3646
'sys_data_scope_rule',
3747
MappedBase.metadata,
38-
Column('id', BigInteger, primary_key=True, unique=True, index=True, autoincrement=True, comment='主键ID'),
39-
Column(
48+
sa.Column('id', sa.BigInteger, primary_key=True, unique=True, index=True, autoincrement=True, comment='主键ID'),
49+
sa.Column(
4050
'data_scope_id',
41-
BigInteger,
42-
ForeignKey('sys_data_scope.id', ondelete='CASCADE'),
51+
sa.BigInteger,
52+
sa.ForeignKey('sys_data_scope.id', ondelete='CASCADE'),
4353
primary_key=True,
4454
comment='数据范围 ID',
4555
),
46-
Column(
56+
sa.Column(
4757
'data_rule_id',
48-
BigInteger,
49-
ForeignKey('sys_data_rule.id', ondelete='CASCADE'),
58+
sa.BigInteger,
59+
sa.ForeignKey('sys_data_rule.id', ondelete='CASCADE'),
5060
primary_key=True,
5161
comment='数据规则 ID',
5262
),

backend/app/admin/model/menu.py

Lines changed: 11 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22

33
from typing import TYPE_CHECKING
44

5-
from sqlalchemy import BigInteger, ForeignKey, 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, relationship
99

1010
from backend.app.admin.model.m2m import sys_role_menu
@@ -20,35 +20,25 @@ class Menu(Base):
2020
__tablename__ = 'sys_menu'
2121

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

4539
# 父级菜单一对多
4640
parent_id: Mapped[int | None] = mapped_column(
47-
BigInteger,
48-
ForeignKey('sys_menu.id', ondelete='SET NULL'),
49-
default=None,
50-
index=True,
51-
comment='父菜单ID',
41+
sa.BigInteger, sa.ForeignKey('sys_menu.id', ondelete='SET NULL'), default=None, index=True, comment='父菜单ID'
5242
)
5343
parent: Mapped[Menu | None] = relationship(init=False, back_populates='children', remote_side=[id])
5444
children: Mapped[list[Menu] | None] = relationship(init=False, back_populates='parent')
Lines changed: 20 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
from datetime import datetime
22

3-
from sqlalchemy import String
4-
from sqlalchemy.dialects.mysql import JSON, LONGTEXT
5-
from sqlalchemy.dialects.postgresql import TEXT
3+
import sqlalchemy as sa
4+
5+
from sqlalchemy.dialects.mysql import LONGTEXT
66
from sqlalchemy.orm import Mapped, mapped_column
77

88
from backend.common.model import DataClassBase, TimeZone, id_key
@@ -15,28 +15,25 @@ class OperaLog(DataClassBase):
1515
__tablename__ = 'sys_opera_log'
1616

1717
id: Mapped[id_key] = mapped_column(init=False)
18-
trace_id: Mapped[str] = mapped_column(String(32), comment='请求跟踪 ID')
19-
username: Mapped[str | None] = mapped_column(String(20), comment='用户名')
20-
method: Mapped[str] = mapped_column(String(20), comment='请求类型')
21-
title: Mapped[str] = mapped_column(String(255), comment='操作模块')
22-
path: Mapped[str] = mapped_column(String(500), comment='请求路径')
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(LONGTEXT().with_variant(TEXT, 'postgresql'), 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-
args: Mapped[str | None] = mapped_column(JSON(), comment='请求参数')
18+
trace_id: Mapped[str] = mapped_column(sa.String(32), comment='请求跟踪 ID')
19+
username: Mapped[str | None] = mapped_column(sa.String(20), comment='用户名')
20+
method: Mapped[str] = mapped_column(sa.String(20), comment='请求类型')
21+
title: Mapped[str] = mapped_column(sa.String(255), comment='操作模块')
22+
path: Mapped[str] = mapped_column(sa.String(500), 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+
args: Mapped[str | None] = mapped_column(sa.JSON(), comment='请求参数')
3232
status: Mapped[int] = mapped_column(comment='操作状态(0异常 1正常)')
33-
code: Mapped[str] = mapped_column(String(20), insert_default='200', comment='操作状态码')
34-
msg: Mapped[str | None] = mapped_column(LONGTEXT().with_variant(TEXT, 'postgresql'), comment='提示消息')
33+
code: Mapped[str] = mapped_column(sa.String(20), insert_default='200', comment='操作状态码')
34+
msg: Mapped[str | None] = mapped_column(sa.TEXT().with_variant(LONGTEXT, 'mysql'), comment='提示消息')
3535
cost_time: Mapped[float] = mapped_column(insert_default=0.0, comment='请求耗时(ms)')
3636
opera_time: Mapped[datetime] = mapped_column(TimeZone, comment='操作时间')
3737
created_time: Mapped[datetime] = mapped_column(
38-
TimeZone,
39-
init=False,
40-
default_factory=timezone.now,
41-
comment='创建时间',
38+
TimeZone, init=False, default_factory=timezone.now, comment='创建时间'
4239
)

backend/app/admin/model/role.py

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22

33
from typing import TYPE_CHECKING
44

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

1010
from backend.app.admin.model.m2m import sys_role_data_scope, sys_role_menu, sys_user_role
@@ -20,18 +20,12 @@ class Role(Base):
2020
__tablename__ = 'sys_role'
2121

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

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

0 commit comments

Comments
 (0)