From 26206f937b15140aaeb1a4e86e913bcd95512b5a Mon Sep 17 00:00:00 2001 From: "allen.yan" Date: Tue, 3 Jun 2025 13:14:35 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8A=A0=E5=85=A5=20User.data=20(sqlite)=20?= =?UTF-8?q?=E7=94=A8seeder=20=E6=BB=99=E5=85=A5=E8=B3=87=E6=96=99=20202506?= =?UTF-8?q?03?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/SqliteUploadController.php | 2 +- app/Jobs/TransferSqliteTableJob.php | 24 ++++++++++-------- database/User.data | Bin 0 -> 77824 bytes database/seeders/DatabaseSeeder.php | 14 +++++----- 4 files changed, 22 insertions(+), 18 deletions(-) create mode 100644 database/User.data diff --git a/app/Http/Controllers/SqliteUploadController.php b/app/Http/Controllers/SqliteUploadController.php index 4dbb3df..88a172d 100644 --- a/app/Http/Controllers/SqliteUploadController.php +++ b/app/Http/Controllers/SqliteUploadController.php @@ -66,7 +66,7 @@ class SqliteUploadController extends Controller $filename = $request->file('file')->getClientOriginalName(); $path = $request->file('file')->storeAs('sqlite', $filename, 'local'); - TransferSqliteTableJob::dispatch(Storage::disk('local')->path($path)); + TransferSqliteTableJob::dispatch(Storage::disk('local')->path($path),deleteFile: true); return response()->json([ 'message' => '上傳成功,已派送資料處理任務', 'path' => $path, diff --git a/app/Jobs/TransferSqliteTableJob.php b/app/Jobs/TransferSqliteTableJob.php index dbf304d..991368c 100644 --- a/app/Jobs/TransferSqliteTableJob.php +++ b/app/Jobs/TransferSqliteTableJob.php @@ -14,9 +14,11 @@ class TransferSqliteTableJob implements ShouldQueue use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; protected string $sqlitePath; + protected bool $deleteFile; - public function __construct(string $sqlitePath){ + public function __construct(string $sqlitePath , bool $deleteFile = false){ $this->sqlitePath=$sqlitePath; + $this->deleteFile = $deleteFile; } public function handle(): void @@ -26,7 +28,8 @@ class TransferSqliteTableJob implements ShouldQueue return; } // ✅ 動態產生唯一 connection 名稱 - $connectionName = 'tempsqlite_' . md5($this->sqlitePath . microtime()); + $connectionName = 'sqlite_' . md5($this->sqlitePath . microtime()); + config(["database.connections.{$connectionName}" => [ 'driver' => 'sqlite', 'database' => $this->sqlitePath, @@ -42,6 +45,7 @@ class TransferSqliteTableJob implements ShouldQueue if (empty($sqliteTables)) { logger()->error("❌ No tables found in SQLite database."); + DB::purge($connectionName); return; } @@ -58,7 +62,6 @@ class TransferSqliteTableJob implements ShouldQueue DB::statement("CREATE TABLE IF NOT EXISTS _{$table} LIKE {$table}"); $rows = DB::connection($connectionName)->table($table)->cursor(); - $buffer = []; $count = 0; @@ -67,22 +70,22 @@ class TransferSqliteTableJob implements ShouldQueue $count++; if ($count % 500 === 0) { - DB::connection($mysqlConnection)->table("_" . $table)->insert($buffer); + DB::connection($mysqlConnection)->table("_{$table}")->insert($buffer); $buffer = []; } } if (!empty($buffer)) { - DB::connection($mysqlConnection)->table("_" . $table)->insert($buffer); + DB::connection($mysqlConnection)->table("_{$table}")->insert($buffer); } DB::statement("RENAME TABLE {$table} TO {$table}_"); DB::statement("RENAME TABLE _{$table} TO {$table}"); DB::statement("DROP TABLE IF EXISTS {$table}_"); - logger()->info("✅ Done: {$table} ({$count} records)"); + logger()->info("✅ Imported: {$table} ({$count} records)"); } catch (\Exception $e) { - logger()->error("❌ Failed to transfer {$table}: " . $e->getMessage()); + logger()->error("❌ Failed to import {$table}: " . $e->getMessage()); } finally { DB::connection($mysqlConnection)->statement('SET FOREIGN_KEY_CHECKS=1;'); } @@ -90,12 +93,13 @@ class TransferSqliteTableJob implements ShouldQueue // 🔥 結束後刪檔與釋放 connection DB::purge($connectionName); - if (file_exists($this->sqlitePath)) { + + if ($this->deleteFile && file_exists($this->sqlitePath)) { sleep(1); unlink($this->sqlitePath); - logger()->info("🧹 Temp SQLite file deleted: {$this->sqlitePath}"); + logger()->info("🧹 Deleted SQLite file: {$this->sqlitePath}"); } - logger()->info("🎉 All tables transferred."); + logger()->info("🎉 SQLite import completed: {$this->sqlitePath}"); } } \ No newline at end of file diff --git a/database/User.data b/database/User.data new file mode 100644 index 0000000000000000000000000000000000000000..55c187fb946cd460b14576ba3c90fd09b05a0641 GIT binary patch literal 77824 zcmeI*O>EoN0S9n?NiuCq&xsSL-40ch1c|4_p}s81Sh2dc^WoZY9NYP58wiw0*{mhX z7Nx{Cx&d;q9fqFT(|Q=XQ%~Dr!wy?p>@ci{4Hz&i*cVXjP+-HbbpwhO7_iG8A0=6q z=~QYmz-|6S!pD#I_}=@GkK~g{X>noJsOq6Yxl&TAp*T0h@jUljD8zBxG5UX){%;Ne zIw3V@XvnusA2fN48#RCG_sw!g#b>y{azOOI<$reYje-C4e?xw=@8iC6z9sM1e4^*9 zmlOXgeLy2&fWYAqs81jD1=mu1y=Iu2zF8`3dNI4ITG@5IQZg*dD4SN+S!!sFiR#w6 zo;^7F@Z|OBiKXe#m8(xpJLuVUXGqmuzW+b~b;gPyE<~BP3?2LCkvNZRQVOI4Oy%I9Z)sR^$7WWn>bXTq9S5=qQ z?rGO6MoFz~h1T?~eOa}(yuZ>TSB`jtcTzmZc80Z4q-VOUTC0}Xd}D8Q)Fm5rWjI=2 z4)}tR2*0Ct09MLH-P%pVX30TlY^}{@PyFAZnwdO|=vm?oE<`?^h?Tq@hby@UV^qYcFo(X)PD3kM{mBOmvoc1tlidSswF+_)~;4+YDLQ) zxSDQCt?F7b$e#-;*t7fzb_aJ@;iEKXInOeHL$lXY}w(h#cA0W zT+HzG7uacl!dqoiEoRkxUbn1lwY;X&b2F!bb8zm~)TxnGV9;BC>0zTcg^I(%w+JX^t$V zYeQ9Y2E9NTx)lyp_01}^DymjBTeCWvAzh(wt{WBI>TI++2hjX*D{MzL`ixkd1G97S$%vTYk_94>Cr>^;R|(gXjDhuy2xOU^;z7Jc1q zp||6ZaEr5>&w=~Zb?>;@j;N9^7!C4uA2XzTszPrJSIef}IB~Ego<^zmo+tK4c5v8o zyO3-<;Sp8bpM@jpoSRsD=^88I|g)rfxY` zK-#`mbb7O2*?$~_G`*nKiq+7Wnn|0<85-59s?{28vYj`)yHOQ8nzI+~>J_74>~GJ_ zqj`UhG^u^9FXi-#(ymgdXl^!(-8+}Ne9T5R^l<>c&EB~e_wrxg}u7B8C7>CNdE z;`1xk^V>7(+?9k9y_{Z*r3-2yPLsEl;$gMbc*32JxYkzHN`^VY#xB)t&%mvk^U2Y* zsfl|lQ>Kv_z4l^qZJ{=8&RQ%JR!;vv`FB-5$gcj*1bvd0`Fi{4FV8=00bZa0SG_<0uX=z1Ry{K?7#mDfg@btZ92jL0SG_<0uX=z1Rwwb z2tWV=PmVx+SQz9Y{OP(s$bOn&ef{M*`&X~6m+jvs5Z3eOS9P^g&C#EYO=se2BA-v? zl9`y6R|jwAn|BMcCL00bZa0SG_<0uX=z1Rwwb2z-tNj!O}qpXm7LMi`bNvfQ!M>HpU_ z@(!tejw*pg&otB8uQYd^ zay-zMtMh7f*J;!Kwp{Jkzq?L3KIr7y_NsQ*Y10EvuB}(TyG}XY-J4Fn(n z0SG_<0uX=z1Rwwb2tWV=k5|Bc{~!JT$7_nMK>z{}fB*y_009U<00Izz00a)30Q&!j dZI7Tl5P$##AOHafKmY;|fB*y_0D;FZ@IQp}vLgTh literal 0 HcmV?d00001 diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index 9e5083a..11ddeea 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -2,9 +2,8 @@ namespace Database\Seeders; -use App\Models\User; -// use Illuminate\Database\Console\Seeds\WithoutModelEvents; use Illuminate\Database\Seeder; +use App\Jobs\ImportSqliteJob; class DatabaseSeeder extends Seeder { @@ -13,10 +12,11 @@ class DatabaseSeeder extends Seeder */ public function run(): void { - $this->call([ - PermissionTableSeeder::class, - CreateAdminUserSeeder::class, - FavoriteSongsSeeder::class, - ]); + (new ImportSqliteJob('database/User.data', false))->handle(); + //$this->call([ + // PermissionTableSeeder::class, + // CreateAdminUserSeeder::class, + // FavoriteSongsSeeder::class, + //]); } }