Tabellen namen mit migration umbenenen

In diesem Forum gibt es Starthilfe zum neuen Extension-System von phpBB 3.1/3.2. Fragen zur Entwicklung von Extensions und zur Konvertierung von phpBB 3.0.x MODs sind ebenfalls willkommen.
Antworten
Benutzeravatar
chris1278
Mitglied
Beiträge: 4100
Registriert: 12.11.2007 06:20
Wohnort: Euskirchen
Kontaktdaten:

Tabellen namen mit migration umbenenen

Beitrag 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.
Benutzeravatar
IMC
Mitglied
Beiträge: 864
Registriert: 25.11.2018 20:32
Wohnort: Lüneburg
Kontaktdaten:

Re: Tabellen namen mit migration umbenenen

Beitrag 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.
Gruß, Thorsten

Meine Extensions
Benutzeravatar
chris1278
Mitglied
Beiträge: 4100
Registriert: 12.11.2007 06:20
Wohnort: Euskirchen
Kontaktdaten:

Re: Tabellen namen mit migration umbenenen

Beitrag 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);
}
Benutzeravatar
IMC
Mitglied
Beiträge: 864
Registriert: 25.11.2018 20:32
Wohnort: Lüneburg
Kontaktdaten:

Re: Tabellen namen mit migration umbenenen

Beitrag 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.
Gruß, Thorsten

Meine Extensions
Benutzeravatar
chris1278
Mitglied
Beiträge: 4100
Registriert: 12.11.2007 06:20
Wohnort: Euskirchen
Kontaktdaten:

Re: Tabellen namen mit migration umbenenen

Beitrag 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.
Benutzeravatar
IMC
Mitglied
Beiträge: 864
Registriert: 25.11.2018 20:32
Wohnort: Lüneburg
Kontaktdaten:

Re: Tabellen namen mit migration umbenenen

Beitrag 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.
Gruß, Thorsten

Meine Extensions
Benutzeravatar
LukeWCS
Supporter
Supporter
Beiträge: 3276
Registriert: 15.12.2014 10:19

Re: Tabellen namen mit migration umbenenen

Beitrag von LukeWCS »

Die Trennung von Schema Änderungen in separate Migrationsdateien wird auch in den Ext Doks empfohlen, wenn ich das richtig in Erinnerung habe.
Möge das Backup mit dir sein. Immer.
Kein Support via PN! Siehe den Punkt "Private Nachrichten" im phpBB.de-Knigge.
Erweiterungen - Infos zur artgerechten Haltung / phpBB Ext Check - Analyse von Erweiterungen bezüglich Vorgaben und Kompatibilität
Benutzeravatar
chris1278
Mitglied
Beiträge: 4100
Registriert: 12.11.2007 06:20
Wohnort: Euskirchen
Kontaktdaten:

Re: Tabellen namen mit migration umbenenen

Beitrag 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.
Antworten

Zurück zu „Extension Bastelstube“