Seite 1 von 1

Tabellen namen mit migration umbenenen

Verfasst: 24.12.2025 09:57
von chris1278
Hallöchen. Ich habe um einen Tabellen namen zu ämndern in meiner Extension dies hier probiert:

Code: Alles auswählen

public function update_data()
{
	return array(

		array('custom', array(array($this, 'update_table'))),
	);
}

public function update_table()
{

	$sql = 'ALTER TABLE ' . $this->table_prefix . 'altename RENAME TO ' . $this->table_prefix . 'neuename';

	$this->db->sql_query($sql);
}

Das funktioniert auch. MeineFrage ist gibt es ein Weg dies auch kürzer zu gestallten. bzw. hat phpbb in seinem System da für eine möglichkeit.

Re: Tabellen namen mit migration umbenenen

Verfasst: 24.12.2025 11:33
von IMC
Hi Chris,

wenn dies für eine offizelle Extension ist kannst du dies so nicht machen.
Der SQL-Befehl wird so von MariaDB 5.1 und MS SQL Server 2000 nicht unterstützt.

Für eine lokale Erweiterung kein Problem.

phpbb selbst, hat keine Funktion um Tabellen oder Tabellenspalten umzubenennen.

Re: Tabellen namen mit migration umbenenen

Verfasst: 24.12.2025 11:46
von chris1278
Ja das ist für meine Simple gallery gedacht. CIh hab da einen fehler drin und den müsste ich mit ner namens änderung beheben.

Wie kann man das den lösen ohne die tabelle neu anzulegen und die daten zu im,portieren.

Oder wäre dies hier eine alternative option:

Code: Alles auswählen

public function update_data()
{
	return array(

		array('custom', array(array($this, 'update_table'))),
	);
}

public function update_table()
{

	$sql = 'RENAME TABLE ' . $this->table_prefix . 'altename RENAME TO ' . $this->table_prefix . 'neuename';

	$this->db->sql_query($sql);
}

Re: Tabellen namen mit migration umbenenen

Verfasst: 24.12.2025 12:57
von IMC
Leider nein.
RENAME TABLE alter_name TO neuer_name;
Funktioniert soweit ich weis nur bei MySQL und MariaDB. Bei MariaDB gibt es auch unterschiede in den Programmversionen.

Der Weg, der am wenigsten Probleme mit der Kompabilität bringen wird ist eine Custom-Funktion.

-> Neue Tabelle erstellen.
-> Daten aus der alten Tabelle einlesen
-> Daten in die neue Tabelle schreiben
-> Alte Tabelle löschen

Diesen Ablauf kannst du mit den phpBB integrierten Funktionen erstellen. Zum Erstellen und Löschen der Tabelle kannst du die DB-Tools von phpBB nutzen.
https://area51.phpbb.com/docs/code/3.3. ... tools.html

Auf die Methoden von DB-Tools kanst du in der Migration direkt zugreifen.
z.B. $this->db_tools->sql_create_table(string $table_name, array $table_data)

Edit:
Kapsel deine DB Aktionen mit:

Code: Alles auswählen

	$this->db->sql_transaction('begin');
	
	// Dein Code
	
	$this->db->sql_transaction('commit');	
So kannst du sicherstellen das niemand in die Tabelle schreibt wärend du die Daten kopierst. Kann beim aktivieren wärend der Migration eigendlich nicht passieren. Aber damit ist man immer auf der sicheren Seite.

Re: Tabellen namen mit migration umbenenen

Verfasst: 24.12.2025 13:18
von chris1278
Die tabelle erstellen ist nicht das Problem. Dies kann ich mit migration so machen:

Code: Alles auswählen

public function update_schema()
{
	return [
		'add_tables' => [
			$this->table_prefix . 'chris1278_sg_Info' => [
				'COLUMNS' => [
					'sg_info_id'					=> ['UINT', null, 'auto_increment'],
					'sg_info_old_user_id'			=> ['UINT'			, 0],
					'sg_info_username'				=> ['VCHAR:255'		, ''],
					'sg_info_username_clean'		=> ['VCHAR:255'		, ''],
					'sg_info_perm_dir_user_hash'	=> ['VCHAR:255'		, ''],
				],
				'PRIMARY_KEY' => [
					'sg_info_id',
				],
			]
		],
	];
}
Ich dachte ich könnte mir den weg mittels umbennen einfach machen damit ich eben nicht die ganzen einträge übernehmen muss. naja dann mus ich wohl. oder ich psse die abfrage an dann spare ich mir das mit dem umschreiben.

Re: Tabellen namen mit migration umbenenen

Verfasst: 24.12.2025 13:56
von IMC
chris1278 hat geschrieben: 24.12.2025 13:18Dies kann ich mit migration so machen:
Das ist richtig. Nur dann hat man nicht die 100%'ige Kontrolle über die Abfolge der Befehle.
Dieses Problem kann man dann lösen indem man zwei Migrationsdateien erstellt.
damit ich eben nicht die ganzen einträge übernehmen muss
Um dies Problem einfach zu lösen kann man Werte, bei denen es Sinn macht, über Konstanten definiert.

Re: Tabellen namen mit migration umbenenen

Verfasst: 24.12.2025 14:35
von LukeWCS
Die Trennung von Schema Änderungen in separate Migrationsdateien wird auch in den Ext Doks empfohlen, wenn ich das richtig in Erinnerung habe.

Re: Tabellen namen mit migration umbenenen

Verfasst: 24.12.2025 20:02
von chris1278
Ok. Da es sich aber um meine Gallery handelt brauch ich das hier nicht zu berücksichtigen:

Code: Alles auswählen

	$this->db->sql_transaction('begin');
	
	// Dein Code
	
	$this->db->sql_transaction('commit');	
weil man mus dafür ja eh die erweiterung deaktivieren und da dies nichst mit z.B. BEiträgen oder so zu tun hat besteht da eigentlich keine gefahr das da was dazwischen funkt.

@edit

habs jetzt angepasst auch das sql_tranaction hab ich am anfang und am ende eingefügt.

Hab dann drei dateien erstellt.

In der Ersten datei lege ich eine Temporäre tabelle an mit den selben spalten namen wie die info tabelle. Anschliessend lese ich die info tabell mit foreach aus und schreinbe zeile rein und lösche die geschriebene zeile und das solange bis alle in der info tabelle rübergeschoben sind.

Code: Alles auswählen

public function rename_step_2()
{
	$this->db->sql_transaction('begin');

	$sql = 'SELECT *
			FROM ' . $this->table_prefix . 'chris1278_sg_Info
			WHERE 1';
	$result = $this->db->sql_query($sql);
	$info_row	= $this->db->sql_fetchrowset($result);
	$this->db->sql_freeresult($result);

	foreach ($info_row as $row)
	{
		$sql_insert = [
			'sg_info_id'					=> $row['sg_info_id'],
			'sg_info_old_user_id'			=> $row['sg_info_old_user_id'],
			'sg_info_username'				=> $row['sg_info_username'],
			'sg_info_username_clean'		=> $row['sg_info_username_clean'],
			'sg_info_perm_dir_user_hash'	=> $row['sg_info_perm_dir_user_hash'],
		];

		$this->db->sql_query('INSERT INTO ' . $this->table_prefix . 'chris1278_temp ' . $this->db->sql_build_array('INSERT', $sql_insert));

		$sql = 'DELETE FROM ' . $this->table_prefix . 'chris1278_sg_Info
			WHERE sg_info_id = "' .  (int) $row['sg_info_id'] . '"';

		$sql = $this->db->sql_query($sql);
	}
}
}
Im zweiten schritt also in der zweiten datei lösche ich dann die leere tabelle und erstelle mit korrektem namen neu und dann führe ich das skript oben wieder aus nur andersrum.

in der Dritten datei lösche ich die temporäre tabelle und fertig.