ngodb
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [ngodb] Co teraz robić?


From: Radoslaw Janeczko
Subject: Re: [ngodb] Co teraz robić?
Date: Wed, 23 Feb 2005 12:32:06 +0100
User-agent: Mozilla Thunderbird 1.0 (X11/20041227)

By the day 02/23/2005 11:05 AM, fellow named Piotr Szmigielski wrote:
3. Jak ma wyglądać uaktualnianie / synchronizacja danych pomiędzy
węzłami (trzeba się nad tym ostro zastanowic, gdyż przyjęty
mechanizm może mieć duży wpływ na strukturę bazy danych)

To jest odrębna sprawa. Synchronizacja powinna być odrębnym

procesem, opartym

o zawnętrzne narzędzia lub dodatkowe moduły aplikacji. W tym

momencie zostawmy

ją na później.


System moze być odrębny, ale dane umozliwiające synchronizację myszą
(?) być zawarte w samej bazie danych, a to ma wpływ na strukturę...
Tak samego mechanizmu wymyślać od razu nie trzeba, ale dość ciężko
będzie dołączyć ją później

Naszym celem jest taki stan, w którym aplikacja kliencka nic nie wie o synchronizacji. Wszelkie mechanizmy synchronizujące muszą działać w sposób przezroczysty, albo jako zewnętrzne narzędzia, albo moduł, który wepniemy w logikę. Będzie to wymagało jedynie dodania dodatkowych wywołań funkcji, które nie wpłyną na działanie aplikacji.

W tej chwili nie wiemy nawet, czy synchronizacja będzie odbywać się na poziomie bazy danych (np. wierszy tabeli), czy warstwy logicznej aplikacji (np. przesyłanie obiektów typu 'osoba')...


poza tym, jęsli całość miałby być napisana w tym dziwnym, wężowym
języku ;) to musiałbym dostać najprostszy przykładowy plik np.
łączący się z bazą danych (nie jestem pewien, czy mam ochotę
przechodzic cały tutorial do pythona)

W tutorialu Pythona nie znajdziesz info o łączeniu z bazą :( Na szczęście większość pythonowych API bazodanowych zgodna jest ze specyfikacją DBAPI2:
http://www.python.org/peps/pep-0249.html

Przykładowy driver dla SQLite: http://pysqlite.org

Pierwszy krok zależy od danego drivera. Kilka przykładów:
1. SQLite

<code>
import sqlite
con = sqlite.connect("db")
</code>

2. MySQL

<code>
import MySQLdb
con = MySQLdb.connect(host="localhost", user="user", passwd="passwd", db="db")
</code>

3. PostgreSQL

<code>
from pyPgSQL import PgSQL
con = PgSQL.connect(host="host",database="db",user="login",password="passwd")
</code>

To daje nam obiekt połączenia. Jeśli baza obsługuje transakcje, autocommit standardowo jest wyłączony.

Kolejne kroki są już podobne dla wszystkich baz danych. Całościowy przykład dla SQLite:

<code>

import sqlite
con = sqlite.connect("db")
cur = con.cursor()
cur.execute("SELECT imie, nazwisko FROM osoba")

while True:
    row = cur.fetchone()
    if row == None:
        break
    print "%s %s" % (row[1], row[0])

</code>

Powyższe wyciągnie wszystkie wiersze z tabelki 'osoba' i wypisze je na ekran.

Z INSERT i UPDATE postępujemy podobnie:

<code>
cur.execute("INSERT INTO osoba (imie, nazwisko) VALUES ('Ala', 'Kot')")
</code>

Jeśli chcemy użyć prepared statement (BARDZO przyspiesza hurtowe operacje), w zapytaniu umieszczamy symbol parametru dla wartości kolumny, zależnego od danego drivera. Obowiązujący styl nazewnictwa wyciągniemy ze stałej 'paramstyle' danego drivera, np.:

>>> print sqlite.paramstyle
pyformat

co oznacza, że możemy używać standardowego formatowania Pythona:

<code>
cur.execute("INSERT INTO osoba (imie, nazwisko) VALUES (%s, %s)",
            (imie, nazwisko))
</code>

albo:

<code>
cur.execute("INSERT INTO osoba (imie, nazwisko) VALUES (%(imie)s, %(nazw)s)",
            {"imie": imie, "nazw": nazwisko})
</code>

mam nadzieję, że pomoże :)

pozdrawiam
--
Radoslaw Janeczko
Software Developer, GTS Polska
e-mail: address@hidden





reply via email to

[Prev in Thread] Current Thread [Next in Thread]