Pony ORM. Dominik Kozaczko, PyWaw #73

Podobne dokumenty
Gdzie jest moja tabela?

Podzapytania do tabel W miejscu w którym możemy użyć nazwy tabeli, możemy użyć podzapytania

a) ile wynosiła populacja najbardziej i najmniej ludnego z województw (oraz jakie były ich nazwy)

Zapytania z ograniczeniem czasowym w Oracle

10. Wybierz nazwy produktów oraz inf. o stanie magazynu dla produktów dostarczanych przez firmę.tokyo Traders.

Plan. ! Podzapytania (subqueries) ! Podzapytania do tabel. ! Podzapytanie jako wyrażenie. ! Podzapytania skorelowane. ! operatory IN, NOT IN

Relacyjne bazy danych. Podstawy SQL

DMX DMX DMX DMX: CREATE MINING STRUCTURE. Tadeusz Pankowski

E.14 Bazy Danych cz. 13 SQL Grupowanie danych i funkcje grupujące

NORTHWIND. Anonco.pl. ćwiczenia praktyczne. KiK s Tutorials. NORTHWIND dwiczenia praktyczne. ANONCO.PL/SQL SQLSERVERDLAOPORNYCH.WORDPRESS.

Wstęp Wprowadzenie do BD Podstawy SQL. Bazy Danych i Systemy informacyjne Wykład 1. Piotr Syga

SELECT * FROM tabela WHERE warunek wybiera dane spełniające podany warunek

Relacyjne bazy danych. Podstawy SQL

- język zapytań służący do zapisywania wyrażeń relacji, modyfikacji relacji, tworzenia relacji

Bazy danych. dr inż. Arkadiusz Mirakowski

Bazy danych. Andrzej Grzybowski. Instytut Fizyki, Uniwersytet Śląski

Specyfika języka SQL powoduje, że łatwiej jest najpierw wytłumaczyć, jak korzystać z funkcji grupujących, a dopiero później jak grupować dane.

ACESS- zadania z wykorzystaniem poleceń SQL

SAS ETL Studio Wprowadzenie

SQLAlchemy - Portale Internetowe

Leszek Stasiak Zastosowanie technologii LINQ w

Autor: Joanna Karwowska

Przykłady najlepiej wykonywać od razu na bazie i eksperymentować z nimi.

Generowanie dokumentów XML z tabel relacyjnych - funkcje SQLX

Grupowanie i funkcje agregujące

Grupowanie danych klauzula GROUP BY

Informatyka (5) SQL. dr inż. Katarzyna Palikowska Katedra Transportu Szynowego p. 4 Hydro

Cel przedmiotu. Wymagania wstępne w zakresie wiedzy, umiejętności i innych kompetencji 1 Język angielski 2 Inżynieria oprogramowania

Agregacja i Grupowanie Danych. Funkcje Agregacji. Opcje GROUP BY oraz HAVING

Bazy danych Ćwiczenia z SQL

Kurs języka Python. Wątki

znaleźć wszystkie rekordy dotyczące adresów przy ulicy Hożej (dowolnego miasta!);

Hackowanie zamrożonych binariów

Bazy danych SQL Server 2005

Złaczenia tablic: FROM, WHERE, JOIN

Język SQL. Rozdział 7. Zaawansowane mechanizmy w zapytaniach

Podstawy języka SQL. SQL Structured Query Languagestrukturalny

Systemy GIS Tworzenie zapytań w bazach danych

KOLEKCJE - to typy masowe,zawierające pewną liczbę jednorodnych elementów

Bazy danych. Bazy danych. Zapytania SELECT. Dr inż. Paweł Kasprowski.

Wykład 6. SQL praca z tabelami 3

Informatyka sem. III studia inżynierskie Transport 2018/19 LAB 2. Lab Backup bazy danych. Tworzenie kopii (backup) bazy danych

Ćwiczenia laboratoryjne nr 11 Bazy danych i SQL.

Sexy unit testy. czyli o kilku praktykach w testach jednostkowych

Bazy Danych - Instrukcja do Ćwiczenia laboratoryjnego nr 8

Microsoft SQL Server Podstawy T-SQL

Wprowadzenie do JDBC z wykorzystaniem bazy H2

Konstruowanie Baz Danych DQL agregacja danych

Przykładowa baza danych BIBLIOTEKA

22 października Akademia Górniczo-Hutnicza, Automatyka i Robotyka. Porównanie LINQ i NHibernate. Mateusz Mazur Ale o co chodzi?

Map Reduce Proste zliczanie słów i zapytania SQL

Integralność danych Wersje języka SQL Klauzula SELECT i JOIN

Relacyjne bazy danych a XML

Zadania z SQLa (MS SQL Server)

T-SQL dla każdego / Alison Balter. Gliwice, cop Spis treści. O autorce 11. Dedykacja 12. Podziękowania 12. Wstęp 15

Wprowadzenie do języka SQL

Podzapytania. Podzapytania nieskorelowane i skorelowane

Programowanie i projektowanie obiektowe

Jerzy Nawrocki, Wprowadzenie do informatyki

SQL praca z tabelami 4. Wykład 7

Programowanie w Ruby

Język SQL. Rozdział 4. Funkcje grupowe Funkcje grupowe, podział relacji na grupy, klauzule GROUP BY i HAVING.

TEMAT ĆWICZENIA Zapoznanie z technologią LINQ

Bazy danych. Wykład V Kwerendy. Copyrights by Arkadiusz Rzucidło 1

Aplikacje bazodanowe. Laboratorium 4. Dawid Poªap Aplikacje bazodanowe - laboratorium 4 Marzec, 15, / 13

Language INtegrated Query (LINQ)

PLAN WYKŁADU BAZY DANYCH PODSTAWOWE KWESTIE BEZPIECZEŃSTWA OGRANICZENIA DOSTĘPU DO DANYCH

Bazy danych. Andrzej Łachwa, UJ, /15

Plan. Wyświetlanie n początkowych wartości (TOP n) Użycie funkcji agregujących. Grupowanie danych - klauzula GROUP BY

Encje w Drupalu. Tworzenie własnych encji i ich wpływ na poprawę wydajności

Bazy danych wykład trzeci. Konrad Zdanowski

Bazy Danych i Usługi Sieciowe

Analiza i projektowanie aplikacji Java

Wybór wszystkich danych: SELECT * FROM employee Wybór określonych kolumn lub wyrażeń: SELECT first_name, last_name, salary FROM employee

Autor: Joanna Karwowska

Programowanie po stronie serwera w SZBD. Robert A. Kłopotek Wydział Matematyczno-Przyrodniczy. Szkoła Nauk Ścisłych, UKSW

Protokół JDBC współpraca z relacyjnymi bazami danych lab3

P o d s t a w y j ę z y k a S Q L

DB2 XML w relacyjnych bazach danych wstęp do wprowadzenia. Kuba Pochrybniak

przygotował: Podstawy języka MDX Tworzenie zbiorów

opisuje nazwy kolumn, wyrażenia arytmetyczne, funkcje nazwy tabel lub widoków warunek (wybieranie wierszy)

SQL - Structured Query Language. strukturalny język zapytań

Bazy danych 8. Podzapytania i grupowanie. P. F. Góra

Transakcje inf. podstawowe

Bazy danych i usługi sieciowe

Podzapytania. Rozdział 5. Podzapytania. Podzapytania wyznaczające wiele krotek (1) Podzapytania wyznaczające jedną krotkę

Wprowadzenie do SQL TEMAT 3 - Zadania dodatkowe

Mapowanie obiektowo-relacyjne z wykorzystaniem Hibernate

Wzorce logiki dziedziny

IOF INTERNET OFFER FORMAT

1: 2: 3: 4: 5: 6: 7: 8: 9: 10:

Plan. krótkie opisy modułów. 1 Uwagi na temat wydajności CPython a. 2 Podstawowe techniki poprawiające wydajność obliczeniową

Krok 1. SELECT Symbol AS KS INTO Dzielnik FROM Towary WHERE (Nazwa='Orzeszki solone') OR (Nazwa = 'Zupy CHOISE') OR (Nazwa = 'Kawa BURG');

Lista zadań nr 1. Bazy danych laboratorium. dr inż. Grzegorz Bazydło, dr inż. Jacek Tkacz

Komunikacja z bazą danych psql

Język SQL podstawy zapytań

Wprowadzenie do BD Operacje na bazie i tabelach Co poza zapytaniami? Algebra relacji. Bazy Danych i Systemy informacyjne Wykład 2.

Autor: Joanna Karwowska

Dostęp do baz danych z serwisu www - PHP. Wydział Fizyki i Informatyki Stosowanej Joanna Paszkowska, 4 rok FK

Transkrypt:

Pony ORM Dominik Kozaczko, PyWaw #73

Trochę o sobie w Pythonie od 2005 roku; w Django od 2006 wraz z uczniami przetłumaczyłem Byte of Python uczyłem Pythona w liceum zanim to stało się modne ;) zainicjowałem akcję Python na maturze (kudos dla CEO) uczę Pythona i Django na YouTube - youtube.com/dekoza

Plan prezentacji 1. Zady i walety ORM. 2. Co nam daje PonyORM? 3. Ograniczenia 4. Przykłady 5. Jak to działa pod maską? 6. Podsumowanie

Zady i walety ORM Fajniusie: obiektowa manipulacja wpisami w bazie wygodne portowanie struktury bazy oraz zapytań Mniej fajniusie: własna składnia zapytań rakowacenie złożonych kwerend

Co nam daje Pony ORM?

Co nam daje Pony ORM? obiektowa manipulacja wpisami w bazie wygodne portowanie struktury bazy oraz zapytań pythonowa składnia zapytań wysoka optymalizacja nawet złożonych kwerend

Ej! Na pewno ma jakieś wady! dłuższe kwerendy robią się nieczytelne i trzeba rozbijać ciężko się przestawić z tradycyjnych ORMów jeszcze nie wszystkie funkcje są zaimplementowane

Przykład - deklaracja modeli from pony.orm import * db = Database("sqlite", "estore.sqlite", create_db=true) class Customer(db.Entity): email = Required(str, unique=true) password = Required(str) name = Required(str) country = Required(str) address = Required(str) cart_items = Set("CartItem") orders = Set("Order") class Product(db.Entity): id = PrimaryKey(int, auto=true) name = Required(str) categories = Set("Category") description = Optional(str) picture = Optional(buffer) price = Required(Decimal) quantity = Required(int) cart_items = Set("CartItem") order_items = Set("OrderItem") etc

Przykład - zapytania result = select(p for p in Product).order_by( lambda p: desc( sum(p.order_items.quantity) ) ).first() SELECT "p"."id" FROM "Product" "p" LEFT JOIN "OrderItem" "orderitem" ON "p"."id" = "orderitem"."product" GROUP BY "p"."id" ORDER BY coalesce(sum("orderitem"."quantity"), 0) DESC LIMIT 1 result = select((customer, category.name) for customer in Customer for product in customer.orders.items.product for category in product.categories if count(product) > 1)[:] SELECT DISTINCT "customer"."id", "category"."name" FROM "Customer" "customer", "Order" "order", "OrderItem" "orderitem", "Category_Product" "t-1", "Category" "category" WHERE "customer"."id" = "order"."customer" AND "order"."id" = "orderitem"."order" AND "orderitem"."product" = "t-1"."product" AND "t-1"."category" = "category"."id" GROUP BY "customer"."id", "category"."name" HAVING COUNT(DISTINCT "orderitem"."product") > 1

Jak to działa pod maską? 1. Dekompilacja generatora (i lambd) i przebudowanie go do postaci Abstract Source Tree 2. Przetłumaczenie AST na abstrakcyjny SQL 3. Przetłumaczenie abstrakcyjnego SQLa do konkretnego dialektu Źródło: https://stackoverflow.com/questions/16115713/how-pony-orm-does-its-tricks

Jak to działa pod maską? >>> gen = (c for c in Customer if c.country == 'USA') >>> import dis >>> dis.dis(gen.gi_frame.f_code) 1 0 LOAD_FAST 0 (.0) >> 3 FOR_ITER 26 (to 32) 6 STORE_FAST 1 (c) 9 LOAD_FAST 1 (c) 12 LOAD_ATTR 0 (country) 15 LOAD_CONST 0 ('USA') 18 COMPARE_OP 2 (==) 21 POP_JUMP_IF_FALSE 3 24 LOAD_FAST 1 (c) 27 YIELD_VALUE 28 POP_TOP 29 JUMP_ABSOLUTE 3 >> 32 LOAD_CONST 1 (None) 35 RETURN_VALUE >>> from pony.orm.decompiling import decompile >>> ast, external_names = decompile(gen) >>> ast GenExpr(GenExprInner(Name('c'), [GenExprFor(AssName('c', 'OP_ASSIGN'), Name('.0'), [GenExprIf(Compare(Getattr(Name('c'), 'country'), [('==', Const('USA'))]))])])) Źródło: https://stackoverflow.com/questions/16115713/how-pony-orm-does-its-tricks

Ciekawe konsekwencje generowanie optymalnego kodu SQL możliwość keszowania fragmentów oraz całych zapytań tworzenie zapytania jest szybsze 1,5x - 3x niż w Django czy SQLAlchemy

DZIEKUJĘ! Live long and may the Force be with you ( ʖ )