<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Code42 &#187; mysql</title>
	<atom:link href="http://code42.pl/tag/mysql/feed/" rel="self" type="application/rss+xml" />
	<link>http://code42.pl</link>
	<description>Wielkie Pytanie o Życie, Kod i całą resztę</description>
	<lastBuildDate>Wed, 25 Jan 2012 14:16:01 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Migracja MySQL → PostgreSQL aplikacji w Symfony 1.1</title>
		<link>http://code42.pl/2008/12/15/migracja-mysql%c2%a0%e2%86%92-postgresql-aplikacji-w-symfony-11/</link>
		<comments>http://code42.pl/2008/12/15/migracja-mysql%c2%a0%e2%86%92-postgresql-aplikacji-w-symfony-11/#comments</comments>
		<pubDate>Mon, 15 Dec 2008 10:05:23 +0000</pubDate>
		<dc:creator>zergu</dc:creator>
				<category><![CDATA[Bazy danych]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[postgresql]]></category>
		<category><![CDATA[propel]]></category>

		<guid isPermaLink="false">http://code42.pl/?p=5</guid>
		<description><![CDATA[Jako, że w MySQL nie dzieje się najlepiej postanowiliśmy zmigrować jeden z naszych projektów na Postgresa. Bazuje on na Symfony 1.1, co oznacza starego Propela 1.2. Samo przestawienie połączenia nie stwarzało większych problemów, wystarczyło w databases.yml i propel.ini przerobić mysql na pgsql: all: propel: class: sfPropelDatabase param: persistent: true phptype: pgsql … propel.database = pgsql propel.database.createUrl = pgsql://zdzislaw@localhost/ [...]


Podobne wpisy:<ol><li><a href='http://code42.pl/2008/12/19/aktualizacja-oprogramowania-a-wydajnosc/' rel='bookmark' title='Aktualizacja oprogramowania a wydajność'>Aktualizacja oprogramowania a wydajność</a></li>
<li><a href='http://code42.pl/2009/01/05/symfony-paginacja-przy-wlasnychnietypowych-warunkach-sql/' rel='bookmark' title='Symfony: Paginacja przy własnych/nietypowych warunkach SQL'>Symfony: Paginacja przy własnych/nietypowych warunkach SQL</a></li>
<li><a href='http://code42.pl/2009/07/21/logowanie-do-pliku-wszystkich-zapytan-w-postgresql/' rel='bookmark' title='Logowanie do pliku wszystkich zapytań w PostgreSQL'>Logowanie do pliku wszystkich zapytań w PostgreSQL</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><img src="http://code42.pl/wp-content/uploads/great-migration-536x194.jpg" alt="" title="great-migration" width="536" height="194" class="aligncenter size-medium wp-image-672" /></p>
<p>Jako, że w <a title="Założyciel MySQL ostrzega przed aktualną wersją" href="http://www.heise-online.pl/news/Zalozyciel-MySQL-ostrzega-przed-aktualna-wersja--/6612">MySQL nie dzieje się najlepiej</a> postanowiliśmy zmigrować jeden z naszych projektów na Postgresa. Bazuje on na Symfony 1.1, co oznacza starego Propela 1.2. </p>
<p>Samo przestawienie połączenia nie stwarzało większych problemów, wystarczyło w <code>databases.yml</code> i <code>propel.ini</code> przerobić <code>mysql</code> na <code>pgsql</code>:</p>
<pre>
all:
  propel:
    class:          sfPropelDatabase
    param:
    persistent:       true
    phptype:          pgsql
…
</pre>

<div class="wp_syntax"><div class="code"><pre class="ini" style="font-family:monospace;">propel.database            <span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;"> pgsql</span>
propel.database.createUrl  <span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;"> pgsql://zdzislaw@localhost/</span>
propel.database.url        <span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;"> pgsql://zdzislaw@localhost/piwo</span></pre></div></div>

<p>Przebudowanie modelu, utworzeniu bazy i jej struktury również wykonało się bez problemu, ale to był koniec tego dobrego.</p>
<h2>Brak SERIAL</h2>
<p>Niestety, propelowy generator skryptu SQL tworzącego schemat bazy nie uraczył nas typem <code>SERIAL</code> przy identyfikatorach, jednakże w samej aplikacji nie stwarza to problemów, ponieważ sekwencje i bez tego są wykorzystywane. Także trzeba po prostu uważać podczas zabawy w <abbr title='Command Line Interface'>CLI</abbr> Postgresa, gdy mogą one doprowadzić do anomalii z identyfikatorami.</p>
<h2>Dane binarne pobierane „ręcznie”</h2>
<p>Drobny problem pojawił się w miejscach, gdzie pobieraliśmy dane binarne (BLOB/BYTEA) własnym zapytaniem, omijając wbudowany we framework Active Record. Dane takie trzeba było dodatkowo „od-eskejpować” funkcją <a href='http://php.net/manual/en/function.stripcslashes.php'><code>stripcslashes</code></a>.</p>
<p class='notice'>
AKTUALIZACJA: Po aktualizacji projektu do Symfony 1.2 (chociaż tutaj właściwie chodzi o aktualizację Propela do wersji 1.3) okazało się, że żadne <code>stripcslashes</code> nie będzie potrzebne, ponieważ dane binarne (blob) są pobierane jako… stream. Innymi słowy, przy zapytaniach tworzonych samodzielnie, do akcji musiała wkroczyć funkcja <a href='http://php.net/manual/en/function.stream-get-contents.php'><code>stream_get_contents</code></a>.
</p>
<h2>GROUP BY</h2>
<p>Najwięcej problemów sprawiło grupowanie, ponieważ PostgreSQL ostro trzyma się standardów i wymusza podanie wszystkich używanych kolumn w klauzuli <code>GROUP BY</code>. MySQL natomiast „po cichu” sam sobie je dołączał. Różnicę w zachowaniu prezentuje poniższy (nie mający większego sensu) przykład:</p>
<pre>psql=# select sum(id), id from users;
ERROR:  column "users.id" must appear in the GROUP BY clause
or be used in an aggregate function</pre>
<pre>mysql>  select sum(id), id from users;
+---------+----+
| sum(id) | id |
+---------+----+
|  45     |  1 |
+---------+----+
</pre>
<h2>CONCAT</h2>
<p>Łącznie ciągów znaków odbywa się całkiem inaczej w MySQL i PgSQL. W tym pierwszym wykonuje się to za pomocą funkcji <code>CONCAT()</code>, natomiast w drugim wykorzystuje się operator <code>||</code>. Także trzeba było wykonać małą robótkę ręczną.</p>
<h2>FORMAT</h2>
<p>W naszym kodzie używaliśmy MySQL-owego <code>FORMAT()</code>, aby ograniczyć liczbę cyfr po przecinku, którego w Postgresie nie ma. Można by tutaj użyć funkcji <code>ROUND()</code>, obecnej i tu i tu, jednak zdecydowaliśmy się przenieść rozwiązanie tego problemu do warstwy języka programowania.</p>
<h2>LIKE</h2>
<p><code>LIKE</code> w Postgresie, w przeciwieństwie do MySQL, rozróżnia wielkość znaków. Jednak naprawa tej przypadłości sprowadza się jedynie od zamiany <code>LIKE</code> na <code>ILIKE</code>.</p>
<h2>Coś dziwnego</h2>
<p>Na koniec coś, czego do końca nie udało nam się zrozumieć. Zaraz po przestawieniu konfiguracji na <code>pgsql</code>, strona przestała odpowiadać (a dokładniej odpowiadała, gdy połączenie z bazą przekroczyło czas oczekiwania). Niemniej jednak PostgreSQL sam w sobie działał, jak również możliwe było połączenie z „czystego” PHP. Jedynie aplikacja Symfony dziwnie się zachowywała. W logach pojawiało się następujące stwierdzenie:</p>
<p><code>Dec  4 11:20:22 myhost httpd:  [wrapped: Could not connect [Native Error: pg_pconnect() [function.pg-pconnect]: Unable to connect to PostgreSQL server: server closed the connection unexpectedly  This probably means the server terminated abnormally    before or while processing the request.] [User Info: host=localhost port=80 dbname='piwo' user='zdzislaw'] [User Info: Array]]</code></p>
<p>Taka sama sytuacja powtórzyła się na dwóch różnych maszynach (jednak na tym samym <a title="Arch Linux" href="http://archlinux.org">systemie operacyjnym</a>). Niezrozumiałe jest to, że w czasie różnych zabaw z konfiguracją wszystko wracało do normy, jednak nie bardzo da się znaleźć konkretną przyczynę. Innymi słowy nie potrafimy zreprodukować tej sytuacji.</p>
<h2>Krótkie podsumowanie</h2>
<p>Migracja rozwiniętego projektu w Symfony okazała się być stosunkowo mało problematyczna. Kłopotów mogło by być jeszcze mniej, gdyby unikać rozwiązań specyficznych dla danego systemu baz danych. Ale w końcu jak często migruje się z jednej systemu zarządzania bazami danych do innego?</p>


<p>Podobne wpisy:<ol><li><a href='http://code42.pl/2008/12/19/aktualizacja-oprogramowania-a-wydajnosc/' rel='bookmark' title='Aktualizacja oprogramowania a wydajność'>Aktualizacja oprogramowania a wydajność</a></li>
<li><a href='http://code42.pl/2009/01/05/symfony-paginacja-przy-wlasnychnietypowych-warunkach-sql/' rel='bookmark' title='Symfony: Paginacja przy własnych/nietypowych warunkach SQL'>Symfony: Paginacja przy własnych/nietypowych warunkach SQL</a></li>
<li><a href='http://code42.pl/2009/07/21/logowanie-do-pliku-wszystkich-zapytan-w-postgresql/' rel='bookmark' title='Logowanie do pliku wszystkich zapytań w PostgreSQL'>Logowanie do pliku wszystkich zapytań w PostgreSQL</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://code42.pl/2008/12/15/migracja-mysql%c2%a0%e2%86%92-postgresql-aplikacji-w-symfony-11/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

