Skip to content

Commit 6ebfeec

Browse files
committed
support MySQL
1 parent 599d53e commit 6ebfeec

File tree

4 files changed

+212
-2
lines changed

4 files changed

+212
-2
lines changed

src/BlazorAdmin/BlazorAdmin.Servers.Core/BlazorAdmin.Servers.Core.csproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,9 @@
2323
<PackageReference Include="MudBlazor.Markdown" Version="8.6.0" />
2424
<PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.14.0" />
2525
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="9.0.5" />
26+
<PackageReference Include="MySql.Data" Version="9.4.0" />
2627
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="9.0.4" />
28+
<PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="9.0.0-rc.1.efcore.9.0.0" />
2729
<PackageReference Include="Quartz.Extensions.DependencyInjection" Version="3.14.0" />
2830
<PackageReference Include="Quartz.Extensions.Hosting" Version="3.14.0" />
2931
<PackageReference Include="Quartz.Serialization.Json" Version="3.14.0" />

src/BlazorAdmin/BlazorAdmin.Servers.Core/Data/DatabaseExtension.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,11 @@ public static WebApplicationBuilder AddDatabase(this WebApplicationBuilder build
3535
else if (dbProvider == "PostgreSQL")
3636
{
3737
AppContext.SetSwitch("Npgsql.EnableLegacyTimestampBehavior", true);
38-
b.UseNpgsql(dbConnectinoString);
38+
b.UseNpgsql(dbConnectinoString);
39+
}
40+
else if (dbProvider == "MySQL")
41+
{
42+
b.UseMySql(dbConnectinoString, ServerVersion.AutoDetect(dbConnectinoString));
3943
}
4044
b.UseSeeding((d, v) => (d as BlazorAdminDbContext).InitialData(v));
4145
}, ServiceLifetime.Scoped);

src/BlazorAdmin/BlazorAdmin.Servers.Core/Data/QuartzExtension.cs

Lines changed: 200 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using Microsoft.Data.SqlClient;
33
using Microsoft.Data.Sqlite;
44
using Microsoft.Extensions.DependencyInjection;
5+
using MySqlConnector;
56
using Npgsql;
67
using Quartz;
78

@@ -33,6 +34,10 @@ public static IServiceCollection AddQuartzService(this IServiceCollection servic
3334
{
3435
x.UsePostgres(opt => opt.ConnectionString = connectionString);
3536
}
37+
else if (dbProvider == "MySQL")
38+
{
39+
x.UseMySql(opt => opt.ConnectionString = connectionString);
40+
}
3641

3742
x.UseNewtonsoftJsonSerializer();
3843
});
@@ -90,6 +95,33 @@ public static void InitialQuartzTable(string connectionString, string dbProvider
9095
conn.Close();
9196
}
9297
}
98+
else if (dbProvider == "MySQL")
99+
{
100+
using (var conn = new MySqlConnection(connectionString))
101+
{
102+
conn.Open();
103+
104+
// 先检查表是否存在
105+
bool tableExists = false;
106+
using (var cmd = conn.CreateCommand())
107+
{
108+
cmd.CommandText = "SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'QRTZ_JOB_DETAILS'";
109+
var result = cmd.ExecuteScalar();
110+
tableExists = (result != null);
111+
}
112+
113+
// 如果表不存在,则创建表
114+
if (!tableExists)
115+
{
116+
using (var cmd = conn.CreateCommand())
117+
{
118+
cmd.CommandText = MySQLScript;
119+
cmd.ExecuteNonQuery();
120+
}
121+
}
122+
conn.Close();
123+
}
124+
}
93125
}
94126

95127
#region Sqlite Script
@@ -704,6 +736,174 @@ PRIMARY KEY (sched_name,lock_name)
704736
";
705737

706738
#endregion
739+
740+
#region MySQL Script
741+
742+
private const string MySQLScript = @"
743+
744+
745+
CREATE TABLE QRTZ_JOB_DETAILS(
746+
SCHED_NAME VARCHAR(120) NOT NULL,
747+
JOB_NAME VARCHAR(200) NOT NULL,
748+
JOB_GROUP VARCHAR(200) NOT NULL,
749+
DESCRIPTION VARCHAR(250) NULL,
750+
JOB_CLASS_NAME VARCHAR(250) NOT NULL,
751+
IS_DURABLE BOOLEAN NOT NULL,
752+
IS_NONCONCURRENT BOOLEAN NOT NULL,
753+
IS_UPDATE_DATA BOOLEAN NOT NULL,
754+
REQUESTS_RECOVERY BOOLEAN NOT NULL,
755+
JOB_DATA BLOB NULL,
756+
PRIMARY KEY (SCHED_NAME,JOB_NAME,JOB_GROUP))
757+
ENGINE=InnoDB;
758+
759+
CREATE TABLE QRTZ_TRIGGERS (
760+
SCHED_NAME VARCHAR(120) NOT NULL,
761+
TRIGGER_NAME VARCHAR(200) NOT NULL,
762+
TRIGGER_GROUP VARCHAR(200) NOT NULL,
763+
JOB_NAME VARCHAR(200) NOT NULL,
764+
JOB_GROUP VARCHAR(200) NOT NULL,
765+
DESCRIPTION VARCHAR(250) NULL,
766+
NEXT_FIRE_TIME BIGINT(19) NULL,
767+
PREV_FIRE_TIME BIGINT(19) NULL,
768+
PRIORITY INTEGER NULL,
769+
TRIGGER_STATE VARCHAR(16) NOT NULL,
770+
TRIGGER_TYPE VARCHAR(8) NOT NULL,
771+
START_TIME BIGINT(19) NOT NULL,
772+
END_TIME BIGINT(19) NULL,
773+
CALENDAR_NAME VARCHAR(200) NULL,
774+
MISFIRE_INSTR SMALLINT(2) NULL,
775+
JOB_DATA BLOB NULL,
776+
PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
777+
FOREIGN KEY (SCHED_NAME,JOB_NAME,JOB_GROUP)
778+
REFERENCES QRTZ_JOB_DETAILS(SCHED_NAME,JOB_NAME,JOB_GROUP))
779+
ENGINE=InnoDB;
780+
781+
CREATE TABLE QRTZ_SIMPLE_TRIGGERS (
782+
SCHED_NAME VARCHAR(120) NOT NULL,
783+
TRIGGER_NAME VARCHAR(200) NOT NULL,
784+
TRIGGER_GROUP VARCHAR(200) NOT NULL,
785+
REPEAT_COUNT BIGINT(7) NOT NULL,
786+
REPEAT_INTERVAL BIGINT(12) NOT NULL,
787+
TIMES_TRIGGERED BIGINT(10) NOT NULL,
788+
PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
789+
FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
790+
REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP))
791+
ENGINE=InnoDB;
792+
793+
CREATE TABLE QRTZ_CRON_TRIGGERS (
794+
SCHED_NAME VARCHAR(120) NOT NULL,
795+
TRIGGER_NAME VARCHAR(200) NOT NULL,
796+
TRIGGER_GROUP VARCHAR(200) NOT NULL,
797+
CRON_EXPRESSION VARCHAR(120) NOT NULL,
798+
TIME_ZONE_ID VARCHAR(80),
799+
PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
800+
FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
801+
REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP))
802+
ENGINE=InnoDB;
803+
804+
CREATE TABLE QRTZ_SIMPROP_TRIGGERS
805+
(
806+
SCHED_NAME VARCHAR(120) NOT NULL,
807+
TRIGGER_NAME VARCHAR(200) NOT NULL,
808+
TRIGGER_GROUP VARCHAR(200) NOT NULL,
809+
STR_PROP_1 VARCHAR(512) NULL,
810+
STR_PROP_2 VARCHAR(512) NULL,
811+
STR_PROP_3 VARCHAR(512) NULL,
812+
INT_PROP_1 INT NULL,
813+
INT_PROP_2 INT NULL,
814+
LONG_PROP_1 BIGINT NULL,
815+
LONG_PROP_2 BIGINT NULL,
816+
DEC_PROP_1 NUMERIC(13,4) NULL,
817+
DEC_PROP_2 NUMERIC(13,4) NULL,
818+
BOOL_PROP_1 BOOLEAN NULL,
819+
BOOL_PROP_2 BOOLEAN NULL,
820+
TIME_ZONE_ID VARCHAR(80) NULL,
821+
PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
822+
FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
823+
REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP))
824+
ENGINE=InnoDB;
825+
826+
CREATE TABLE QRTZ_BLOB_TRIGGERS (
827+
SCHED_NAME VARCHAR(120) NOT NULL,
828+
TRIGGER_NAME VARCHAR(200) NOT NULL,
829+
TRIGGER_GROUP VARCHAR(200) NOT NULL,
830+
BLOB_DATA BLOB NULL,
831+
PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
832+
INDEX (SCHED_NAME,TRIGGER_NAME, TRIGGER_GROUP),
833+
FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
834+
REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP))
835+
ENGINE=InnoDB;
836+
837+
CREATE TABLE QRTZ_CALENDARS (
838+
SCHED_NAME VARCHAR(120) NOT NULL,
839+
CALENDAR_NAME VARCHAR(200) NOT NULL,
840+
CALENDAR BLOB NOT NULL,
841+
PRIMARY KEY (SCHED_NAME,CALENDAR_NAME))
842+
ENGINE=InnoDB;
843+
844+
CREATE TABLE QRTZ_PAUSED_TRIGGER_GRPS (
845+
SCHED_NAME VARCHAR(120) NOT NULL,
846+
TRIGGER_GROUP VARCHAR(200) NOT NULL,
847+
PRIMARY KEY (SCHED_NAME,TRIGGER_GROUP))
848+
ENGINE=InnoDB;
849+
850+
CREATE TABLE QRTZ_FIRED_TRIGGERS (
851+
SCHED_NAME VARCHAR(120) NOT NULL,
852+
ENTRY_ID VARCHAR(140) NOT NULL,
853+
TRIGGER_NAME VARCHAR(200) NOT NULL,
854+
TRIGGER_GROUP VARCHAR(200) NOT NULL,
855+
INSTANCE_NAME VARCHAR(200) NOT NULL,
856+
FIRED_TIME BIGINT(19) NOT NULL,
857+
SCHED_TIME BIGINT(19) NOT NULL,
858+
PRIORITY INTEGER NOT NULL,
859+
STATE VARCHAR(16) NOT NULL,
860+
JOB_NAME VARCHAR(200) NULL,
861+
JOB_GROUP VARCHAR(200) NULL,
862+
IS_NONCONCURRENT BOOLEAN NULL,
863+
REQUESTS_RECOVERY BOOLEAN NULL,
864+
PRIMARY KEY (SCHED_NAME,ENTRY_ID))
865+
ENGINE=InnoDB;
866+
867+
CREATE TABLE QRTZ_SCHEDULER_STATE (
868+
SCHED_NAME VARCHAR(120) NOT NULL,
869+
INSTANCE_NAME VARCHAR(200) NOT NULL,
870+
LAST_CHECKIN_TIME BIGINT(19) NOT NULL,
871+
CHECKIN_INTERVAL BIGINT(19) NOT NULL,
872+
PRIMARY KEY (SCHED_NAME,INSTANCE_NAME))
873+
ENGINE=InnoDB;
874+
875+
CREATE TABLE QRTZ_LOCKS (
876+
SCHED_NAME VARCHAR(120) NOT NULL,
877+
LOCK_NAME VARCHAR(40) NOT NULL,
878+
PRIMARY KEY (SCHED_NAME,LOCK_NAME))
879+
ENGINE=InnoDB;
880+
881+
CREATE INDEX IDX_QRTZ_J_REQ_RECOVERY ON QRTZ_JOB_DETAILS(SCHED_NAME,REQUESTS_RECOVERY);
882+
CREATE INDEX IDX_QRTZ_J_GRP ON QRTZ_JOB_DETAILS(SCHED_NAME,JOB_GROUP);
883+
884+
CREATE INDEX IDX_QRTZ_T_J ON QRTZ_TRIGGERS(SCHED_NAME,JOB_NAME,JOB_GROUP);
885+
CREATE INDEX IDX_QRTZ_T_JG ON QRTZ_TRIGGERS(SCHED_NAME,JOB_GROUP);
886+
CREATE INDEX IDX_QRTZ_T_C ON QRTZ_TRIGGERS(SCHED_NAME,CALENDAR_NAME);
887+
CREATE INDEX IDX_QRTZ_T_G ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_GROUP);
888+
CREATE INDEX IDX_QRTZ_T_STATE ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_STATE);
889+
CREATE INDEX IDX_QRTZ_T_N_STATE ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP,TRIGGER_STATE);
890+
CREATE INDEX IDX_QRTZ_T_N_G_STATE ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_GROUP,TRIGGER_STATE);
891+
CREATE INDEX IDX_QRTZ_T_NEXT_FIRE_TIME ON QRTZ_TRIGGERS(SCHED_NAME,NEXT_FIRE_TIME);
892+
CREATE INDEX IDX_QRTZ_T_NFT_ST ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_STATE,NEXT_FIRE_TIME);
893+
CREATE INDEX IDX_QRTZ_T_NFT_MISFIRE ON QRTZ_TRIGGERS(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME);
894+
CREATE INDEX IDX_QRTZ_T_NFT_ST_MISFIRE ON QRTZ_TRIGGERS(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME,TRIGGER_STATE);
895+
CREATE INDEX IDX_QRTZ_T_NFT_ST_MISFIRE_GRP ON QRTZ_TRIGGERS(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME,TRIGGER_GROUP,TRIGGER_STATE);
896+
897+
CREATE INDEX IDX_QRTZ_FT_TRIG_INST_NAME ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,INSTANCE_NAME);
898+
CREATE INDEX IDX_QRTZ_FT_INST_JOB_REQ_RCVRY ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,INSTANCE_NAME,REQUESTS_RECOVERY);
899+
CREATE INDEX IDX_QRTZ_FT_J_G ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,JOB_NAME,JOB_GROUP);
900+
CREATE INDEX IDX_QRTZ_FT_JG ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,JOB_GROUP);
901+
CREATE INDEX IDX_QRTZ_FT_T_G ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP);
902+
CREATE INDEX IDX_QRTZ_FT_TG ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,TRIGGER_GROUP);
903+
904+
";
905+
906+
#endregion
707907
}
708908

709909

src/BlazorAdmin/BlazorAdmin.Web/appsettings.json

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,12 @@
4646
},
4747
"AllowedHosts": "*",
4848
"Application": {
49-
"DatabaseProvider": "Sqlite", // Supported values: Sqlite, SqlServerPostgreSQL
49+
"DatabaseProvider": "Sqlite", // Sqlite/SqlServer/PostgreSQL/MySQL
5050
"ConnectionString": "Data Source=DB/BlazorAdmin20250522.db;Cache=Shared",
51+
// mysql:Server=127.0.0.1;Port=3306;Database=XXXX;Uid=root;Pwd=XXXXXX;
52+
// sqlserver:Server=127.0.0.1,1433;Initial Catalog=XXXX;User ID=sa;Password=XXXXXXX;
53+
// postgre:Host=127.0.0.1;Port=5432;Database=XXXX;Username=postgres;Password=XXXXXX;
54+
// sqlite:Data Source=C:\\thumbnail.db;
5155
"UseQuartz": true
5256
}
5357
}

0 commit comments

Comments
 (0)