Autor wpisu: sokzzuka, dodany: 09.06.2010 21:29, tagi: php
Witam w drugiej części tutoriala. Tematem na dziś będzie łączenie się z bazą MySql i wykonywanie prostych zapytań typu insert czy select. Pierwszą rzeczą jaką trzeba wykonać by móc podłączyć się do bazy MySql jest ściągnięcie sterownika. Paczki dla *nixów są na stronie projektu.Dostępne są też instalki dla Windowsa.
Po zainstalowaniu drivera tworzymy dwa pliki. Pierwszy będzie się nazywał common_db
, będziemy go includować za każdym razem gdy będziemy coś robić z bazą, w pliku tym jest funkcja connect, która utworzy nam połączenie z odpowiednimi parametrami:
import MySQLdb def connect(): oDb = MySQLdb.connect (host="localhost", user="root", db="test") return oDb
Dla porównania plik php-owy, który robi dokładnie to samo:
$oDb = new PDO('mysql:dbname=test;host=127.0.0.1', 'root');
Natomiast drugi plik nazywa się test_insert.py
, w którym mamy insertowanie danych do bazy:
import common_db oDb = common_db.connect() content = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.' def test(path): global oDb global content oDb.begin() cursor = oDb.cursor() result = '' for i in range(0,1000): cursor.execute ("INSERT INTO test1(content) values ('"+content+"')") result += "inserted row number"+str(i)+"<br/>" oDb.commit() cursor.close() oDb.close () return result
Ekwiwalent php:
require 'lib/common_db.php'; $sContent = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. '; set_time_limit(0); for ($i=0; $i < 1000; $i++){ $sQuery = "INSERT INTO test1(content) values ('$sContent')"; $oDb->exec($sQuery); echo "inserted row number $i <br/>"; }
Są to skrypty do testów obciążeniowych więc nie dziwcie się, że zapytania tam idą w pętli, oczywiście globale też są złe . Driver Pythonowy nie ma defaultowo ustawionego auto-commita więc wszystkie zapytania typu insert, update, delete trzeba przeprowadzać w transakcji.
Pobieranie z bazy – test_select.py
:
import common_db import random oDb = common_db.connect() def getRandomId(table): global oDb cursor = oDb.cursor() sQuery = 'select max(id) as max, min(id) as min from '+table; cursor.execute(sQuery) iMax, iMin = cursor.fetchone() return random.randint(int(iMin),int(iMax)) def test(path): global oDb cursor = oDb.cursor() cursor.execute('select * from test1 where id = %s',getRandomId('test1')) return cursor.fetchall()
Ekwiwalent php-owy
require 'lib/common_db.php'; function getRandomId($table) { global $oDb; $sCountStatement = 'select max(id) as max, min(id) as min from '.$table; $oCountStatement = $oDb->query($sCountStatement); list( $iMin,$iMax ) = $oCountStatement->fetch(PDO::FETCH_NUM); return rand($iMin,$iMax); } $sStatement = 'select * from test1 where id = ?'; $oQuery = $oDb->prepare( $sStatement ); $iId = getRandomId('test1'); $oQuery->execute(array($iId)); $aResult = $oQuery->fetch(PDO::FETCH_ASSOC); echo($aResult['content']);
Aby przetestować powyższy kod, należy utworzyć w katalogu z projektem z pierwszej części tutorialu ww. pliki, uruchomienie jak poprzednio – http://localhost/py/nazwa_pliku_z_przykladem.py.
Jeszcze na koniec taka mała dygresja, w pierwszej części opisałem jak obsługiwać błędy, niestety informacje, które dostawaliśmy z wyjątku były dość skąpe i rzadko pozwalały zidentyfikować problem.