Changes between Initial Version and Version 1 of AdvancedApplicationDevelopment


Ignore:
Timestamp:
09/25/26 05:20:31 (6 days ago)
Author:
223306
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • AdvancedApplicationDevelopment

    v1 v1  
     1= Advanced Application Development =
     2
     3== Transactions ==
     4
     5Во BiblioPremium се користат трансакции кај сценарија во кои една корисничка акција предизвикува повеќе поврзани промени во базата. На овој начин се обезбедува сите операции да бидат успешно извршени како една целина или, во случај на грешка, сите промени да бидат поништени.
     6
     7=== Трансакција при купување книга ===
     8
     9При купување книга се извршуваат повеќе операции во рамки на една трансакција:
     10
     111. Се проверува цената и достапната количина на книгата.
     122. Се креира нова нарачка во табелата `naracki`.
     133. Се додава ставката во табелата `sodrzi`.
     144. Се евидентира плаќањето во табелата `plakanja`.
     155. Се намалува количината на залиха во табелата `knigi`.
     16
     17Доколку сите операции се успешни се повикува:
     18
     19{{{
     20conn.commit()
     21}}}
     22
     23Доколку настане грешка, се повикува:
     24
     25{{{
     26conn.rollback()
     27}}}
     28
     29со што се поништуваат промените направени во рамки на трансакцијата.
     30
     31Дел од имплементацијата:
     32
     33{{{
     34try:
     35    cursor.execute("""
     36        INSERT INTO project.naracki
     37            (datum, status, vkupna_cena, korisnik_id)
     38        VALUES
     39            (CURRENT_TIMESTAMP, %s, %s, %s)
     40        RETURNING naracka_id;
     41    """, ("ZAVRSENA", vkupna_cena, session["korisnik_id"]))
     42
     43    naracka_id = cursor.fetchone()[0]
     44
     45    cursor.execute("""
     46        INSERT INTO project.sodrzi
     47            (naracka_id, kniga_id, kolicina, edinechna_cena)
     48        VALUES (%s, %s, %s, %s);
     49    """, (naracka_id, kniga_id, kolicina, cena))
     50
     51    cursor.execute("""
     52        INSERT INTO project.plakanja
     53            (datum, iznos, nacin_na_plakjanje, status, naracka_id)
     54        VALUES
     55            (CURRENT_TIMESTAMP, %s, %s, %s, %s);
     56    """, (vkupna_cena, "KARTICKA", "USPESNO", naracka_id))
     57
     58    cursor.execute("""
     59        UPDATE project.knigi
     60        SET kolicina_na_zaliha = kolicina_na_zaliha - %s
     61        WHERE kniga_id = %s;
     62    """, (kolicina, kniga_id))
     63
     64    conn.commit()
     65
     66except Exception as e:
     67    conn.rollback()
     68}}}
     69
     70Трансакцијата беше тестирана преку апликацијата со успешно купување на книгата „Ikigai“. Беше креирана нарачка #16 со количина 1 и вкупна цена 750 денари. Нарачката беше успешно прикажана и во историјата „Мои нарачки“.
     71
     72=== Трансакција при зачувување кориснички преференции ===
     73
     74Трансакција се користи и при промена на корисничките преференции. Старите жанровски и категориски преференции се бришат, а потоа се внесуваат новоизбраните вредности.
     75
     76Доколку сите операции се успешни се извршува `commit()`, а при грешка `rollback()`. На овој начин корисникот не може да остане со делумно ажурирани преференции.
     77
     78== Database Connection Pooling ==
     79
     80За управување со конекциите кон PostgreSQL базата е имплементиран connection pool со `psycopg2.pool`.
     81
     82При стартување на апликацијата се креира pool со минимално 1 и максимално 10 конекции:
     83
     84{{{
     85from psycopg2 import pool
     86
     87db_pool = pool.SimpleConnectionPool(
     88    1,
     89    10,
     90    host="localhost",
     91    port=tunnel.local_bind_port,
     92    database=DB_NAME,
     93    user=DB_USER,
     94    password=DB_PASSWORD
     95)
     96}}}
     97
     98За земање и враќање конекција се користат функции:
     99
     100{{{
     101def get_db_connection():
     102    return db_pool.getconn()
     103
     104def release_db_connection(conn):
     105    db_pool.putconn(conn)
     106}}}
     107
     108Пред пристап до базата, потребната конекција се зема од pool:
     109
     110{{{
     111conn = get_db_connection()
     112cursor = conn.cursor()
     113}}}
     114
     115По завршување на работата cursor-от се затвора, а конекцијата се враќа во pool:
     116
     117{{{
     118cursor.close()
     119release_db_connection(conn)
     120}}}
     121
     122Овој пристап се користи во рутите кои пристапуваат до базата, вклучувајќи пребарување и приказ на книги, препораки, омилени книги, нарачки, преференции и административните функционалности.
     123
     124Connection pool-от беше успешно тестиран при стартување и користење на апликацијата. Апликацијата успешно зема конекции од pool-от, извршува операции кон базата и ги враќа конекциите за повторна употреба.
     125
     126== Заклучок ==
     127
     128Во оваа фаза апликацијата е надградена со трансакциско извршување на операции кои бараат атомарност и со connection pooling за поефикасно управување со конекциите кон PostgreSQL базата.
     129
     130== AI Use ==
     131
     132[wiki:AdvancedApplicationDevelopmentAIUsage Advanced Application Development AI Usage]