[SQL] PostgreSQL backup naar Mysql

Pagina: 1
Acties:

  • BSeB
  • Registratie: Juni 2001
  • Laatst online: 22-09-2025
Ik heb een hele standaar tabel die helemaal zo in Mysql ingevoegd kan worden. Probleem is alleen de laatste kolom in die tabel van Postgre. Deze is van het type text, ook geen probleem zou je zeggen.

Nu is het probleem als volgt. Deze kolom bevat messages van een forum en er zitten dus ook " ' " quotes in. In de backup betekenen die waar de text data tussen staat, maar omdat deze ook in de text staan word heel mijn code ver*&(*.

Sommige inserts zijn dus incorrect. Ik wil dit wle graag goed hebben, zonder een vervangopdracht als dat mogelijk is. Dus dat alle quotes in die text niet meer door de backuop gezien word als einde van de data die in die kolom moet staan.

Verder wil ik via een SQL query een kolom van type laten veranderen, dus van een char naar een varchar, dit kan de hoeveelheid data eneorm vermidneren (120000 records).

Dit zou ik kunnen doen via een ALTER TABLE tabel MODIFY kolom VARCHAR(37);

edit:

Dit was een MySQL opdracht. In Postgre gaat dit dus met:

BEGIN;
ALTER TABLE mytable ADD COLUMN abc_new varchar(64);
UPDATE mytable SET abc_new = abc;
ALTER TABLE mytable RENAME abc TO abc_old;
ALTER TABLE mytable RENAME abc_new TO abc;
COMMIT;

Hierna kan ik de oude kolom neem ik aan verwijderen.

edit 2:

ALTER TABLE distributors
ALTER COLUMN address TYPE varchar(80),
ALTER COLUMN name TYPE varchar(100);

Zo kan het dus wel.

Alleen hij kent de opdracht modify niet? Het gaat hierin om de Postgre database.

Ik hoop dat jullie een antwoord op mijn vragen hebben.

Ps. bij een vervangopdracht is mijn pc te lang bezig om alles te vervangen en dat moet hij dan dus 4 maal doen. Niet zinvol in mijn ogen.

[ Voor 19% gewijzigd door BSeB op 04-10-2005 09:23 ]


  • JaQ
  • Registratie: Juni 2001
  • Laatst online: 00:09

JaQ

ik heb ooit een functie gemaakt in plperlu waarmee je rechtstreeks in mysql kan schrijven vanuit postgres. Het is een beetje een ranzige truc, maar het werkt wel. Misschien kan je daar wat mee?

hier kan je die functie vinden. Je zou natuurlijk die functie kunnen verbouwen en die gebruiken om data te inserten in je mysql (eventueel met een replace op de waarde van de kolom) of door iets te roepen als create table mytable ( select * from brontable ) zou het zomaar eens kunnen werken.

Egoist: A person of low taste, more interested in themselves than in me


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

BSeB schreef op dinsdag 04 oktober 2005 @ 08:30:
Sommige inserts zijn dus incorrect. Ik wil dit wle graag goed hebben, zonder een vervangopdracht als dat mogelijk is. Dus dat alle quotes in die text niet meer door de backuop gezien word als einde van de data die in die kolom moet staan.
Ik snap niet waarom ze incorrect zouden zijn?
Want Postgresql dumpt de boel met insert statements waarbij de ' geescaped wordt met een extra '. MySQL (o.a. de mysql-cli) kan dat prima inlezen. Blijkbaar doe je zelf wat fout in je code?
Verder wil ik via een SQL query een kolom van type laten veranderen, dus van een char naar een varchar, dit kan de hoeveelheid data eneorm vermidneren (120000 records).
Bij Postgresql 8+ kan je gewoon alter table alter kolom type nieuwtype; doen, vziw zijn char en varchar compatible.
Alleen hij kent de opdracht modify niet? Het gaat hierin om de Postgre database.
MySQL's manier van werken is nou niet bepaald "De manier". MySQL heeft een eigen variant op SQL uitgewerkt en geimplementeerd, die in veel gevallen wel wat lijkt op de SQL standaard, maar in details anders is. PostgreSQL houdt zich over het algemeen meer aan de standaard, maar welke variant in dit geval nou volgens de SQL-standaard is weet ik niet, ik gok die van PostgreSQL. Kortom, je moet eigenlijk balen dat je niet de variant van PostgreSQL in MySQL kan toepassen, niet andersom :+
Ps. bij een vervangopdracht is mijn pc te lang bezig om alles te vervangen en dat moet hij dan dus 4 maal doen. Niet zinvol in mijn ogen.
Ik snap niet zo goed wat het probleem is? Je weet toch al hoe je een kolom kan veranderen van type in PostgreSQL?

  • BSeB
  • Registratie: Juni 2001
  • Laatst online: 22-09-2025
kan ik niet gewoon een zoek doen naar alle ' quotes in die kolom en die om laten zetten naar bijvoorbeeld #/\# of naar een apostrof ipv een quote.

Dat zou ook veel kunnen oplossen.

  • jochemd
  • Registratie: November 2000
  • Laatst online: 29-12-2025
BSeB schreef op dinsdag 04 oktober 2005 @ 10:33:
kan ik niet gewoon een zoek doen naar alle ' quotes in die kolom en die om laten zetten naar bijvoorbeeld #/\# of naar een apostrof ipv een quote.
Zie quote_literal() of replace() in de handleiding.
(Maar het probleem blijft in MySQL zitten. De dumps van PostgreSQL zijn volgens de SQL standaard die je met je TU Delft IP adres gewoon via de bibliotheek kan downloaden.)

  • BSeB
  • Registratie: Juni 2001
  • Laatst online: 22-09-2025
Ok, het kan zijn dat het Mysql zijn prob is, maar dan heb ik het probleem al binnen postgre afgevangen.

Zodat ik in Mysql gewoon direct kan invoegen ipv eerst die file in een editor openen en daar zeer interesante vervangopdrachten toe te passen. Als die quotes er namelijk niet zijn is de SQL idd helemaal standaard.

EXECUTE 'UPDATE table SET '
|| quote_literal(#/\#)
|| ' WHERE key = '
|| quote_literal(');

Zoiet of moet het andres

[ Voor 19% gewijzigd door BSeB op 04-10-2005 11:44 ]


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Nog steeds snap ik niet wat het probleem is, want vziw kan MySQL gewoon prima overweg met ' die geescaped worden met nog een ' ipv met een \. Postgresql escaped standaard met een extra ' en dus levert de output van postgresql's dumptool keurig ipv 1x een ' overal 2x een ' op.

Zoals gezegd kan MySQL dat gewoon inlezen, dus lijkt het me dat je toch gewoon iets verkeerd doet. Als je de data selecteert en vervolgens domweg in MySQL probeert te inserten in je code doe je iets fout dat ook met MySQL - MySQL niet zou werken, voor het inserten moet je de data tenslotte escapen (mysql_escape_string in php bijv).

  • BSeB
  • Registratie: Juni 2001
  • Laatst online: 22-09-2025
Dus een Postgredump moet ik zonder problemen kunnen inlezen in Mysql

Dus alleen inserts en data?

pg_dump --inserts --data-only --format=p --table=samengevat databasename > test.sql

Alleen deze opties zou dan moeten werken om uit te voeren! (Er komen natuurlijk nog opties voor gebruikersnaam host en ww bij, maar die zijn hier niet boeiend)

En in mysql invoeren:

mysql < test.sql

[ Voor 15% gewijzigd door BSeB op 04-10-2005 12:16 ]


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

En je vraag of opmerking er verder bij is? Want voor zover ik weet moet dat gewoon werken, werkt het niet, laat dan eens een statement van postgresql's dump zien die in mysql's import niet werkt. En natuurlijk de foutmelding die je erbij krijgt.

Overigens zijn de output van postgresql's copy to file en mysql load data ook compatible als je cvs voor beide gebruikt en evt wat speelt met parameters.

[ Voor 7% gewijzigd door ACM op 04-10-2005 12:48 ]


  • BSeB
  • Registratie: Juni 2001
  • Laatst online: 22-09-2025
Ik ga vanavond even doen als ik tijd heb, kan hier helaas mijn vraag posten en na mijn werk weer verder met friemelen.

Moet zoiezo eerst die char naar varchar zetten, want dat maakt het bestand waarschijnlijk al mb's kleiner en dus wat handzamer.

  • BSeB
  • Registratie: Juni 2001
  • Laatst online: 22-09-2025
Invoegprobleem is inderdaad ook opgelost. Bleek aan het GUI programma te liggen heb het nu met de hand gedaan en dat wilde wel werken.
Pagina: 1