Daha çox

Python və cx_Oracle ilə st_geometry effektiv cədvəlinə toplu şəkildə əlavə etmək?

Python və cx_Oracle ilə st_geometry effektiv cədvəlinə toplu şəkildə əlavə etmək?


Python və cx_Oracle ilə bir CSV sənədini ArcSDE ilə bir Oracle verilənlər bazasının st_geometry effektiv cədvəlinə toplu şəkildə əlavə etməyə çalışıram.

Bunu cx_Oracle execute () metodu ilə edə bilərdim, amma böyük fayllar üçün daha sürətli yanaşma deyil. Bu səbəbdən metod icraçısının () işinə yarayacağam. İcraçı () ilə sətirləri, tam ədədləri olan qeydləri əlavə edə bilirəm ... lakin st_geometry sahələrini deyil. St_geometry sahələri ilə səhv alıram: cx_Oracle.DatabaseError ORA-01036: qanunsuz dəyişən ad / nömrə

"Print cursor.bindnames ()" kodu ilə ['1', '2'] qaytarır, bunun mənası: 3 y: 4 tanınmır. Sadəcə mübahisə naminə, st_geometry ('point (: 3: 4)', 0) 'i st_geometry (point (: 3: 4), 0)' olaraq dəyişdirsəm "print cursor.bindnames ()" qaytarır ['1 ',' 2 ',' 3 '], bunun mənası: 4 tanınmır.

Bu, hazırda istifadə etdiyim nümunə kodudur:


Çözüm tapıldı, növbəti cavaba baxın

# Toplu əlavə # # Nümunə test st_geometry cədvəli # cədvəl testi yaratmaq (col1 varchar2 (30 bayt), col2 varchar2 (30 byte), sde.st_geometry forması); # # Verilənləri cədvələ daxil etmək üçün nümunə sql əlavə # test (col1, col2, forma) dəyərlərinə daxil edin ('val01', 'val02', sde.st_geometry ('point (12.67 2.32)', 0)); # # Nümunə file.csv # val11, val12,34.22,23.22 # val21, val22,12.33,14.22 # val31, val32,13.21,18.32 # import cx_Oracle dsn_tns = cx_Oracle.makedsn ('server', 1521, 'sid') dbCon = cx_Oracle.connect ('user', 'password', dsn_tns) cursor = dbCon.cursor () list = [] f = open ('file.csv', 'r') # srid sde-də etibarlı bir kod olmalıdır. st_spatial_references cursor.prepare ("" "INSERT INTO test (col1, col2, form) DƏYƏRLƏR (: 1,: 2, sde.st_geometry ('point (: 3: 4)', 0))" "") in line f: cüt = line.split (',') list.append ((cüt [0], cüt [1], üzmək (cüt [2]), üzmək (cüt [3]))) çap imleci.bindnames () cursor.executemany (Yoxdur, siyahı) dbCon.commit () f.close () cursor.close () dbCon.close ()

ArcSDE geodatabase-ə bal toplamaq üçün başqa bir yol tapdım. Burada ESRI tərəfindən təqdim olunan nöqtələri müəyyənləşdirməyin başqa bir yolu, çox sayda nöqtə məlumatının toplu əlavələrini yerinə yetirərkən tövsiyə olunan sde.st_geometry (x, y, z, m, srid) əsas götürülür.

# Toplu əlavə # # Nümunə test st_geometry cədvəli # cədvəl testi yaratmaq (col1 varchar2 (30 bayt), col2 varchar2 (30 byte), sde.st_geometry forması); # # Verilənləri cədvələ daxil etmək üçün nümunə sql əlavə # test (col1, col2, forma) dəyərlərinə daxil edin ('val01', 'val02', sde.st_geometry ('point (12.67 2.32)', 0)); # # Nümunə file.csv # val11, val12,34.22,23.22 # val21, val22,12.33,14.22 # val31, val32,13.21,18.32 # import cx_Oracle dsn_tns = cx_Oracle.makedsn ('server', 1521, 'sid') dbCon = cx_Oracle.connect ('user', 'password', dsn_tns) cursor = dbCon.cursor () list = [] f = open ('file.csv', 'r') # srid sde-də etibarlı bir kod olmalıdır. st_spatial_references cursor.prepare ("" "INSERT INTO test (col1, col2, form) DƏYƏRLƏR (: 1,: 2, sde.st_geometry (: 3,: 4, null, null, srid))" "") f: cüt = line.split (',') list.append ((cüt [0], cüt [1], üzmək (cüt [2]), üzmək (cüt [3]))) çap imleci.bindnames () cursor.executemany (Yoxdur, siyahı) dbCon.commit () f.close () cursor.close () dbCon.close ()

Python və cx_Oracle ilə st_geometry effektiv cədvəlinə toplu şəkildə əlavə etmək? - Coğrafi İnformasiya Sistemləri

etlhelper, verilənlər bazaları arasında məlumat ötürülməsini asanlaşdırmaq üçün bir Python kitabxanasıdır.

etlhelper, Python vasitəsilə bir SQL sorğusu aparmağı və nəticələri qaytarmağı asanlaşdırır. DBAPI2 spesifikasiyasına əsasən qurulur və sürücülərin idxalına, bağlantı sətirlərinin formatlaşdırılmasına və kursor rəhbərliyinə baxır. Bu, Python ilə əlaqəli bir verilənlər bazasını sorğu etmək üçün lazım olan qazan plitəsinin kodunu azaldır.

  • setup_oracle_client skript Linux sistemlərinə Oracle Instant Client quraşdırır
  • DbParams obyektləri müxtəlif verilənlər bazası növlərinə (hal-hazırda Oracle, PostgreSQL, SQLite və MS SQL Server) qoşulmağın ardıcıl yolunu təqdim edir.
  • verilənlər bazasına sorğu vermək üçün get_rows, iter_rows, fetchone və digər funksiyalar
  • məlumat daxil etmək üçün icra və icra funksiyaları
  • məlumatları bir verilənlər bazasından digərinə ötürmək üçün copy_rows
  • Parametrləşdirilmiş sorğular və məlumatların uçuşda çevrilməsi üçün dəstək
  • Çıxış nəticələri qrup və ya lüğət olaraq verilmişdir
  • Uzun müddət davam edən məlumat ötürülməsini izləmək üçün vaxt işarəli qeyd mesajları
  • Faydalı səhv mesajlarında uğursuz sorğu SQL göstərilir

Bu vasitələr, başa düşülməsi asan, yüngül, versiyalana bilən və sınaqdan keçirilə bilən Çıxarış-Transform-Yük (ETL) iş axınları yarada bilər. etlhelper, ETL işlərini əlaqələndirmək üçün bir vasitə deyil (Apache Airflow istifadə edin), GIS məlumat formatlarını konvertasiya etmək üçün (ogr2ogr və ya fiona istifadə edin), SQL dialektləri arasında tərcümə etmək və ya Nisbət Əlaqəsi Xəritəçəkməsini təmin etmək (SQLAlchemy istifadə edin). Ancaq bunların hər biri ilə birlikdə istifadə edilə bilər.

Aşağıdakı sənədlər əsas xüsusiyyətlərin necə istifadə edildiyini izah edir. Parametrlər və seçimlərin tam təfərrüatları üçün fərdi funksiya sənədlərinə baxın.

Etlhelper ilə yüksək səviyyədə tanış olmaq üçün FOSS4GUK 2019 təqdimatına baxın Python və Apache Hava axını ilə açıq mənbə məkan ETL: video (20 dəq), slaydlar.

Verilənlər bazası sürücüsü paketləri standart olaraq daxil edilmir və kvadrat mötərizədə göstərilməlidir. Seçimlər oracle (cx_Oracle quraşdırır), mssql (pyodbc quraşdırır) və postgres (psycopg2 quraşdırır). Birden çox dəyər vergüllə ayrıla bilər.

Sqlite3 sürücüsü Python-un Standart Kitabxanasına daxil edilmişdir.

Verilənlər bazası sürücüsündən asılılıqlar

Bəzi verilənlər bazası sürücülərində əlavə asılılıqlar var. Linux-da bunlar sistem paketi meneceri vasitəsilə quraşdırıla bilər.

Oracle Instant Client kitabxanalarının Oracle verilənlər bazalarına qoşulmaları tələb olunur. Linux-da, etlhelper onları Oracle veb saytından yükləmək və açmaq üçün bir skript təqdim edir. Sürücülər quraşdırıldıqdan sonra istifadə olunmadan əvvəl yerləri LD_LIBRARY_PATH mühit dəyişəninə əlavə edilməlidir. setup_oracle_client daha sonra cari qabıq üçün bunu etmək üçün "qaynaqlana" biləcək bir sənəd yazır. Bu iki addım bir əmrdə aşağıdakı kimi yerinə yetirilə bilər:

Bu əmr hər yeni qabıq seansında işlədilməlidir. Zipfile yeri üçün alternativ bir URL və ya fayl sistemi yolu daxil olmaqla daha çox komanda satırı bayraqları üçün setup_oracle_client --help-ə baxın.

Verilənlər bazası bağlantısı detalları DbParams obyektləri tərəfindən müəyyən edilir. Bağlantılar birləşdirmə funksiyaları vasitəsilə həyata keçirilir (aşağıya bax). DbParams obyektləri aşağıdakı kimi və ya from_en Environment () funksiyasından istifadə edərək mühit dəyişkənlərindən yaradılır. Sinif başlanğıc funksiyası verilmiş bir dbtype üçün düzgün atributların təmin edildiyini yoxlayır.

DbParams obyektləri, müəyyən bir verilənlər bazasına şəbəkə üzərindən çata biləcəyini yoxlamaq funksiyasına malikdir. Bunun üçün bir istifadəçi adı və ya parol tələb olunmur.

Digər üsullar / xassələr get_connection_string, get_sqlalchemy_connection_string, paramstyle və copy. Ətraflı məlumat üçün funksiya sənədlərinə baxın.

DbParams.connect () funksiyası, əsas sürücü tərəfindən təmin edildiyi kimi DBAPI2 bağlantısını qaytarır. Kontekst-menecer sintaksisini aşağıdakı kimi istifadə etmək, istifadədən sonra əlaqənin bağlanmasını təmin edir.

Bağımsız bir əlaqə funksiyası, etlhelper-in əvvəlki buraxılışları ilə geriyə uyğunluğu təmin edir:

Hər iki versiya da əsas sürücünün əlaqə funksiyasına ötürülən əlavə açar söz mübahisələrini qəbul edir. Məsələn, aşağıdakılar dəyərlərin UTF-8 olaraq qaytarılmasını təmin etmək üçün cx_Oracle tərəfindən istifadə olunan kod kodlamasını təyin edir:

Yuxarıda göstərilənlər geri qaytarılan məlumatlarda xüsusi simvollar birləşdirildikdə bir həlldir.

SQL Server və digər pyODBC əlaqələri üçün fast_executemany-nin deaktiv edilməsi

Varsayılan olaraq bir etlhelper pyODBC bağlantısı, fast_executemany atributu True olaraq təyin edilmiş bir imleci istifadə edir. Bu parametr bir SQL Server verilənlər bazasına toplu əlavələr yerinə yetirərkən icraçı şirkətin fəaliyyətini yaxşılaşdırır. Bununla birlikdə, bu, pyODBC'nin standart davranışını üstələyir və bunu etməkdə bəzi məhdudiyyətlər var. Vacibdir ki, yalnız SQL Server üçün Microsoft-un ODBC Sürücüsünü istifadə edən proqramlar üçün tövsiyə olunur. PyODBC fast_executemany-yə baxın.

Sorğu artıq köhnəlmiş TEXT və NTEXT tipli sütunları əhatə edirsə, fast_executemany istifadə edərək MemoryError yarada bilər. Bu vəziyyətdə, etlhelper, False olaraq təyin olunan fast_executemany-nin üzərinə düşür və bir xəbərdarlıq çıxardır. MemoryError ilə fast_executemany nəticələri ilə SQL serverinə daxil olma bölməsinə baxın.

Lazım gələrsə, fast_executemany atributu əlaqə funksiyası vasitəsi ilə False olaraq təyin edilə bilər:

Bu açar söz mübahisəsi etlhelper tərəfindən istifadə olunur, əlavə açar söz mübahisələri əsas sürücünün əlaqə funksiyasına ötürülür.

Verilənlər bazası parolları bir mühit dəyişənliyi ilə göstərilməlidir. Bu, onları skriptlər içərisində saxlamağa kömək edir. Bu əmr satırında aşağıdakılar vasitəsilə edilə bilər.

  • ixrac ORACLE_PASSWORD = Linuxdakı bəzi gizli şifrə
  • ORACLE_PASSWORD = Windows-da bəzi gizli şifrə təyin edin

Və ya bir Python terminalında:

SQLite verilənlər bazaları üçün parol tələb olunmur.

Get_rows funksiyası, yerli Python obyektləri kimi məlumatları ehtiva edən adlandırılan kanalların siyahısını qaytarır.

Verilərə indeks (sıra [4]) və ya ad (satır.gün) vasitəsi ilə daxil olmaq mümkündür.

Məlumat seçmək üçün digər funksiyalar təmin edilir. fetchone, fetchmany və fetchall DBAPI v2.0-da göstərilən kursor metodlarına bərabərdir. dump_rows hər sətri bir funksiyaya keçir (default yazdır).

Böyük nəticə dəstləri üzərində döngə üçün iter_rows istifadə etmək tövsiyə olunur. Yalnızca tələb olunduğu kimi məlumat verən bir generator funksiyasıdır. Bu, məlumatların hamısının bir anda yaddaşa yüklənməməsini təmin edir.

Dəyişənlər sorğulara parametr olaraq ötürülərək daxil edilə bilər. Bu "bağlayıcı dəyişənlər", əsas sürücülər tərəfindən SQL enjeksiyon hücumlarının qarşısını almaq üçün təmizlənir. Lazımi paramstyle MY_DB.paramstyle ilə yoxlanıla bilər. Bir mövqe yer tutucuları üçün bir qapaq və ya ad qoyulmuş yer tutucular üçün bir lüğət istifadə olunur.

Sıra fabrikləri qaytarılmış sətirlərin çıxış formatına nəzarət edir. Hər bir satırı lüğət kimi qaytarmaq üçün aşağıdakılardan istifadə edin:

Dict_row_factory, məlumatların JSON / YAML-ə seriyalaşdırılması və ya transformasiya funksiyası ilə ayrı-ayrı sahələrin dəyişdirilməsi zamanı faydalıdır (aşağıya bax). Copy_rows ilə dict_row_factory istifadə edərkən INSERT sorğusu üçün ad qoyulmuş yer tutucuları istifadə etmək lazımdır (məs., PostgreSQL üçün% s əvəzinə% (id) s, Oracle üçün: 1 əvəzinə:).

icra tək bir sətir daxil etmək və ya digər tək cümlələri icra etmək üçün istifadə edilə bilər, məs. "CƏDVƏL YARAT.". İcraçı funksiya bir neçə sıra məlumat daxil etmək üçün istifadə olunur. Sorğuların sayını azaltmaq üçün böyük məlumat dəstləri hissələrə bölünür və partiyalara daxil edilir.

Commit_chunks bayrağı defoltları True. Bu, böyük bir məlumat ötürülməsi zamanı bir səhvin bütün qeydlərin yenidən göndərilməsini tələb etməməsini təmin edir. Hansı qeydlərin göndərilməli olduğunu müəyyənləşdirmək üçün bəzi işlər tələb oluna bilər. Commit_chunks-i False olaraq təyin etmək səhv olduğu halda bütün köçürməni geri qaytaracaqdır.

Kopyalama sətirləri bir SEÇMƏ sorğusundan nəticə alır və onları INSERT sorğusuna parametr kimi tətbiq edir. Mənbə və təyinat cədvəlləri artıq mövcud olmalıdır.

parametrlər əvvəlki kimi SELECT sorğusuna ötürülə bilər və commit_chunks bayrağı təyin edilə bilər.

Məlumatlar uçuş funksiyasını tətbiq etməklə uçuş zamanı çevrilə bilər. Bu bir iterator götürən (məsələn, siyahı) və başqa bir təkrarlayıcı qaytaran hər hansı bir Python çağırıla biləndir (məs. Funksiya). Transform funksiyaları verilənlər bazasından oxunduğu üçün məlumatlara tətbiq edilir və get_rows -type metodları və copy_rows ilə istifadə edilə bilər.

Aşağıdakı kod, qaytarılan yığının fərqli bir sıra sətirdə ola biləcəyini və girişə fərqli uzunluqda ola biləcəyini göstərir. Copy_rows ilə istifadə edildikdə, INSERT sorğusunda transformasiya nəticəsi üçün düzgün yer tutucular olmalıdır. Əlavə məlumatlar hesablamadan, veb xidmətə və ya başqa bir verilənlər bazasına edilən zəngdən yarana bilər.

Dict_row_factory istifadə edərkən fərdi sütunları dəyişdirmək daha asan ola bilər (yuxarıya bax).

Daxili istifadə olunan iter_chunks və iter_rows funksiyaları generatorları qaytarır. Hər bir yığın və ya sıra sırasına yalnız tələb olunduqda əldə edilir. Dəyişdirmə funksiyası siyahı əvəzinə generatoru qaytarmaq üçün də yazıla bilər. Daha sonra məlumatların çevrilməsi yaddaş effektiv iterator-zəncirlər vasitəsilə həyata keçirilə bilər.

Aşağıdakı reseptlər etlhelper-in necə istifadə edilə biləcəyini göstərir.

SQL-də ayıklayın və qeyd ilə tərəqqini izləyin

ETL Helper, xüsusi bir qeyd işləyicisi təmin edir. İşlənmiş sətirlərin sayını göstərən vaxt möhürlü mesajlar giriş səviyyəsini INFO olaraq təyin etməklə aktivləşdirilə bilər. Səviyyə DEBUG olaraq təyin edildikdə, sorğu, misal məlumatları və verilənlər bazası bağlantısı barədə məlumat verilir.

Copy_rows zəngindən gələn nəticə belə olacaq:

Qeyd: verilənlər bazası əlaqələrindəki səhvlər açıq mətnə ​​giriş etimadnaməsini daxil edən çıxış mesajlarında.

Verilənlər bazasına ETL skript şablonunu kopyalayan verilənlər bazası

Aşağıdakı bir ETL skripti üçün bir şablon. Əvvəlki günün bütün sensor oxunuşlarını Oracle mənbəyindən PostgreSQL təyinatına köçürür.

Problemsiz bir şəkildə təkrarlanmasını təmin etmək üçün idempotent skriptlərin yaradılması dəyərlidir. Bu misalda "MÖVCUD OLMADAN CƏDVƏL YARAT" əmri təkrar-təkrar çağırıla bilər. DELETE_SQL əmri, təkrarlanan əsas səhvlərin qarşısını almaq üçün daxilolmadan əvvəl mövcud məlumatları silir. "INSERT VƏ UPDATE", "UPSERT" və ya "INSERT. CONFLICT ON" kimi SQL sintaksisi daha səmərəli ola bilər, lakin dəqiq əmrlər hədəf verilənlər bazası növündən asılıdır.

Apache Airflow-dan ETL Helper skriptlərinə zəng

Aşağıdakı yuxarıdakı skriptdə müəyyən edilmiş copy_readings funksiyasından istifadə edən bir Apache Airflow DAG. Hava axını planlaşdırıcısı 1 Avqust 2019-cu ildən bəri hər gün üçün tapşırıqlar yaradacaq və uyğun başlanğıc və bitmə vaxtları ilə copy_readings çağıracaq.

Yaxşı bilinən mətn olaraq ötürülürsə, məkan məlumatları üçün xüsusi sürücülər tələb olunmur.

Digər məkan əməliyyatları məs. koordinat çevrilmələri, kəsişmələr və buferləmə SQL-də həyata keçirilə bilər. Transform funksiyaları Shapely kitabxanasından istifadə edərək həndəsələri idarə edə bilər.

Veritabanı API / NoSQL-dən ETL skript şablonuna kopyalayın

etlhelper, verilənlər bazasından HTTP API-yə məlumat göndərmək üçün bir ETL yaratmaq üçün Python-un İstəkləri kitabxanası ilə birləşdirilə bilər. API bir NoSQL sənəd mağazası (məsələn, ElasticSearch, Cassandra) və ya başqa bir veb xidmət ola bilər.

Bu nümunə məlumatları Oracle-dan ElasticSearch-ə ötürür. Verilənləri bir anda yaddaşa yükləmədən verilənlər bazasından məlumat almaq üçün iter_rows istifadə edir. Xüsusi çevirmə funksiyası, hər bir məlumat sətrindən iç içə bir lüğət strukturu yaradır. Bu JSON-a "atıldı" və İstəklər vasitəsilə API-yə göndərildi.

Bu nümunədə uğursuz satırlar qeyd olunur və proses davam edir. Bütün işi uğursuz etmək üçün daxil olduqdan sonra HTTPError-u yenidən qaldırın. Bu nümunə hər dəfə bir qeyd yazır. API toplu yükləmələri dəstəkləyirsə, iter_chunks istifadə etmək və qeydləri partiyalarda göndərmək daha sürətli ola bilər.

Pandas kitabxanası SQLAlchemy vasitəsilə verilənlər bazalarına qoşula bilər. Cədvəlli məlumatları idarə etmək üçün güclü alətlərə malikdir. ETL Helper, SQL Alchemy bağlantısını hazırlamağı asanlaşdırır.

ETL Helper, British Geological Survey Informatics tərəfindən yaradılıb və dəstəklənir.

  • John A Stevenson (volkan01010)
  • Jo Walsh (metazool)
  • Declan Valters (dvalters)
  • Colin Blackburn (ximenesuk)
  • Daniel Sutton (kerberpolis)

Kod hələ də aktiv inkişaf mərhələsindədir və qırılma dəyişiklikləri mümkündür. İstifadəçilər versiyanı asılılıq siyahılarına bağlamalı və yeni buraxılışlar üçün deposuna baxmalıdırlar. Töhfə vermək barədə ətraflı məlumat üçün CONTRIBUTING.md saytına baxın.

ETL Helper, LGPL v3.0 lisenziyası altında paylanır. Müəllif hüquqları: © BGS / UKRI 2019


etlhelper, Python vasitəsilə bir SQL sorğusu aparmağı və nəticələri qaytarmağı asanlaşdırır. DBAPI2 spesifikasiyasına əsasən qurulur və sürücülərin idxalına, bağlantı sətirlərinin formatlaşdırılmasına və kursor rəhbərliyinə baxır. Bu, Python ilə əlaqəli bir verilənlər bazasını sorğu etmək üçün lazım olan qazan plitəsinin kodunu azaldır.

Xüsusiyyətləri

  • setup_oracle_client skript Linux sistemlərinə Oracle Instant Client quraşdırır
  • DbParams obyektləri müxtəlif verilənlər bazası növlərinə (hal-hazırda Oracle, PostgreSQL, SQLite və MS SQL Server) qoşulmağın ardıcıl yolunu təqdim edir.
  • verilənlər bazasına sorğu vermək üçün get_rows, iter_rows, fetchone və digər funksiyalar
  • məlumat daxil etmək üçün icra və icra funksiyaları
  • məlumatları bir verilənlər bazasından digərinə ötürmək üçün copy_rows
  • Parametrləşdirilmiş sorğular və məlumatların uçuşda çevrilməsi üçün dəstək
  • Çıxış nəticələri qrup və ya lüğət olaraq verilmişdir
  • Uzun müddət davam edən məlumat ötürülməsini izləmək üçün vaxt işarəli qeyd mesajları
  • Faydalı səhv mesajlarında uğursuz sorğu SQL göstərilir

Bu vasitələr, başa düşülməsi asan, yüngül, versiyalana bilən və sınaqdan keçirilə bilən Çıxarış-Transform-Yük (ETL) iş axınları yarada bilər. etlhelper, ETL işlərini əlaqələndirmək üçün bir vasitə deyil (Apache Airflow istifadə edin), GIS məlumat formatlarını konvertasiya etmək üçün (ogr2ogr və ya fiona istifadə edin), SQL dialektləri arasında tərcümə etmək və ya Nisbət Əlaqəsi Xəritəçəkməsini təmin etmək (SQLAlchemy istifadə edin). Ancaq bunların hər biri ilə birlikdə istifadə edilə bilər.

Aşağıdakı sənədlər əsas xüsusiyyətlərin necə istifadə edildiyini izah edir. Parametrlər və seçimlərin tam təfərrüatları üçün fərdi funksiya sənədlərinə baxın.

Etlhelper ilə yüksək səviyyədə tanış olmaq üçün FOSS4GUK 2019 təqdimatına baxın Python və Apache Hava axını ilə açıq mənbə məkan ETL: video (20 dəq), slaydlar.

Sənədlər


SQL Serverdə əsas açar necə yaradılır

Bir əsas açar yarada bilərik 2 yol:

2. T-SQL: Yeni Cədvəl yaradarkən Birincil Yaradın

SQL Server Management Studio

Addım 1) Cədvəlin adını sağ vurun. Basın Dizayn.

Addım 2) Sütun adını sağ vurun. Basın 'Ilkin Açar seçin '

Nəticə: Course_Id indi a Əsas açar.

T-SQL: Yeni Cədvəl yaradarkən əsas düyməni yaradın.

Aşağıda T-SQL-dən İbtidai Açar ilə cədvəl yaratmaq sintaksisidir

SQL əsas açarı olaraq bir sütunlu bir cədvəl yaradırıq.

Addım 1) Sorğunu tıklayaraq çalıştırın 'İcra etmək.'

Nəticə: Course_Id indi a Əsas açar.

Misal: Eyni Ders Kimliği ilə Birdən çox Qeydin daxil olmasına icazə verdiyini görək.

Addım 1) İlə 4 sıra daxil edin fərqli Course_ID

Addım 2) Seçmə sorğusunu işə salmaqla uğurla daxil edilmiş bütün məlumatları doğrulayın.

Qeyd: Qeyri-İbtidai düyməyə təkrarlanan dəyərlər əlavə edə bilərik.

Addım 3) İndi əsas qeyd olan mövcud bir Course_ID ilə Yeni qeydlər əlavə etməyə çalışaq.

Nəticə: Birincil Açar olan Course_ID sütunu 4 olduğu üçün sistem yeni dəyər daxil etməyə icazə vermir.

T-SQL: Dəyişdirmə Cədvəlindən istifadə edərək mövcud cədvələ bir əsas açar əlavə edin

İndi SQL-də mövcud cədvələ əsas açarın necə əlavə ediləcəyini görəcəyik:

Birincil açar yaratmaq üçün ALTER ifadəsini istifadə edə bilərsiniz. Lakin, əsas açar yalnız NOT NULL olaraq təyin olunan sütunlarda yaradıla bilər. NULL-lərə imkan verən bir sütunda əsas düymə yarada bilməzsiniz. Yapmanız lazım olsa, masanı atıb yenidən yaratmalısınız.

Onsuz da mövcud olan bir cədvələ əsas bir əsas məhdudiyyət əlavə etdik. Məhdudiyyət qəbul sütununa əlavə edildi və tələbələr_pk adı verildi.


İlk Tətbiqiniz¶

İndi əlaqənin işlədiyini təsdiqlədiyiniz üçün, a yaratmağın vaxtı gəldi Django tətbiqi Tək bir Python paketində birlikdə yaşayan və tam bir Django tətbiqetməsini təmsil edən modellər və görünüşlər daxil olmaqla bir paket Django kodu.

Buradakı terminologiyanı izah etməyə dəyər, çünki bu, yeni başlayanlar üçün təhlükə yaradır. Biz artıq yaratdıq layihə, Fəsil 2-də, a arasındakı fərq nədir? layihə və bir tətbiqetmə? Fərq konfiqurasiya ilə kod arasındakı fərqdir:

  • Layihə, müəyyən bir Django tətbiqinin bir nümunəsidir, üstəgəl bu tətbiqlər üçün konfiqurasiyadır.

    Texniki cəhətdən bir layihənin yeganə tələbi, verilənlər bazası bağlantısı məlumatlarını, quraşdırılmış tətbiqlərin siyahısını, TEMPLATE_DIRS və s. Müəyyənləşdirən bir ayar faylı təmin etməsidir.

  • Bir tətbiq, adətən modellər və görünüşlər daxil olmaqla, tək bir Python paketində birlikdə yaşayan portativ Django funksionallıq dəstidir.

    Məsələn, Django bir şərh sistemi və avtomatik bir idarəçi interfeysi kimi bir sıra tətbiqlərlə gəlir. Bu tətbiqetmələrə diqqət yetirməli olan bir şey, onların birdən çox proyektdə portativ və yenidən istifadə edilə bilməsi.

Django kodunuzu bu sxemə necə uyğunlaşdıracağınıza dair çox az sayda qaydalar var. Sadə bir veb sayt qurursanız, yalnız bir tətbiqdən istifadə edə bilərsiniz. Bir e-ticarət sistemi və mesaj lövhəsi kimi bir-biri ilə əlaqəsi olmayan bir neçə hissədən ibarət kompleks bir veb sayt qurursanız, ehtimal ki, bunları ayrı-ayrı tətbiqlərə ayırmaq istəyərsiniz ki, gələcəkdə bunları təkrar istifadə edə biləsiniz. .

Həqiqətən, bu kitabda indiyə kimi yaratdığımız nümunə baxış funksiyaları ilə sübut edildiyi kimi mütləq tətbiqetmə yaratmağınıza ehtiyac yoxdur. Bu hallarda, sadəcə views.py adlı bir fayl yaratdıq, görüntüləmə funksiyaları ilə doldurduq və URLconf-u həmin funksiyalara yönəltdik. Xeyr & # 8220apps & # 8221 ehtiyac duyuldu.

Bununla yanaşı, tətbiq konvensiyası ilə bağlı bir tələb var: Django & # 8217s verilənlər bazası qatını (modelləri) istifadə edirsinizsə, bir Django tətbiqi yaratmalısınız. Modellər tətbiqlər daxilində yaşamalıdır. Beləliklə, modellərimizi yazmağa başlamaq üçün yeni bir tətbiq yaratmalıyıq.

My site sayt kataloqu daxilində bir kitab tətbiqi yaratmaq üçün bu əmri yazın:

Bu əmr heç bir nəticə vermir, ancaq mysite qovluğu içərisində bir kitab qovluğu yaradır. Bu qovluğun tərkibinə baxaq:

Bu sənədlər bu tətbiqetmə modellərini və görünüşlərini ehtiva edəcəkdir.

Sevdiyiniz mətn redaktorunda models.py və views.py-yə baxın. Şərhlər və models.py-də bir idxal xaricində hər iki fayl boşdur. Bu Django tətbiqetmənin boş şifrəsidir.


Rədd etmə

  1. Ən sürətli məlumat yaratmaq həlli belədir:
    1. Hər bir ana masaya lazımi sayda sətir daxil edin
    2. Veri yaratmaq məntiqinə uyğun olaraq id-ləri əldə edin və uşaq cədvəlinə sətir əlavə etmək üçün istifadə edin

    Bu ipucuda yuxarıdakı texnikanı istifadə etməyəcəyəm, ancaq hamısını yalnız bir ifadə ilə etməyə çalışın.

    Noutbukumda aşağıda göstərilən texnikadan istifadə edərək 100.000 satır yaratdım. SQL Server-də təxminən 5 dəqiqə çəkən 3 açıqlamanın məntiqi (aşağıda olduğu kimi) ilə müqayisədə 86 saniyə çəkdi.

    1. 1-ci ana cədvələ daxil edin + dəyişənə mağaza çıxışı
    2. 2-ci ana cədvələ daxil edin + dəyişənə mağaza çıxışı
    3. uşaq masasına daxil edin

    2 Cavablar 2

    Parametrləşdirilmiş dəyərlərlə dinamik bir əlavə bəyanatı hazırlayırsınız. Bu işləyir və bu metodda səhv bir şey yoxdur. Hətta vəziyyətiniz üçün ən yaxşı metod ola bilər. Masanız "kiçik" olduqda yaxşı işləyir. Monoton şəkildə böyüyən kifayət qədər böyük bir verilənlər bazasına sahibəm. Sətirlər əlavə etməyə davam edirik və heç vaxt silmirik. Masanız masanızın dizaynına xas olan müəyyən bir nöqtədən kənara çıxdıqda, əlavələr çox yavaş olur. Bu nöqtədə SqlBulkCopy sinifindən istifadə etməyi düşünmək istərdiniz. Dəyərləri bir DataTable-a daxil edirsiniz və sonra toplu əlavə edirsiniz. Bu, daha sürətli, çünki SQL Server-in məlumatların daha sürətli yüklənməsi üçün xüsusi bir metoddan istifadə edir. SqlBulkCopy linkinin nümunə kodu var.


    Təchizatınızın və əməliyyat sisteminizin düzgün qurulub-qurulmadığını yoxlayın:

    • Problemin mənbəyi (CPU / IO / Yaddaş / Mübadilə İstifadəsi). Bir çox IOP var? CPU yüklənib? Əgər IOP-ləriniz çox oxunubsa, ehtimal ki, kifayət qədər böyük InnoDB buffer_poolunuz yoxdur. CPU yüklənərsə, ehtimal ki, sorğularınız uyğun indekslərdən istifadə etmək əvəzinə tam masa taramaları edir.
    • Disk / RAID / LVM quraşdırma. Bəzi xüsusi quraşdırmalarda LVM zolağı disk yükünü eqalizasiya etməklə sizə fayda verə bilər (donanım RAID yoxdur, çox LUNS bağlı)
    • IO planlaşdırıcısı: yaxşı bir RAID nəzarətçiniz olduqda, ən yaxşısı, ən yaxşısıdır. RedHat bəzi testlər etdi və Oracle (və digər DB) üçün ən yaxşı seçim olduğunu söylədilər. Bəzi göstəriciləri işlətməlisiniz (tpc-c və ya tpc-e kimi) və aparatınız üçün ən uyğun olanı seçməlisiniz.
    • Yaxşı fayl sistemi - ext3 verilənlər bazasına xüsusi iş yüklərində yaxşı nəticə vermir. XFS və ya OCFS2 daha yaxşıdır. Yenidən bəzi göstəricilərə ehtiyacınız var.
    • Sisteminiz svop istifadə edirsə baxın. Mübadilə istifadə etmək mysql performansını aşağı salır.

    MySQL / InnoDB instansiyanızın düzgün tənzimləndiyini yoxlayın:

    • bufer hovuz ölçüsü - yaddaşdakı məlumat səhifələrini önbelleğe alın
    • innodb_flush_method = O_DIRECT - ikiqat IO tamponlamadan çəkinin
    • InnoDB günlük sənədinin ölçüsünü artırın - intensiv iş yükü yazmaq üçün bu performansı artıra bilər. Ancaq unutmayın: daha böyük günlük faylının ölçüsü daha uzun qəza qurtarma deməkdir. Bəzən saatlarla.
    • innodb_flush_log_at_trx_commit = 0 və ya 2 - Acid ilə əlaqəli deyilsinizsə və son bir-iki saniyə ərzində əməliyyatları itirə bilərsiniz.
    • key_buffer_size - MyISAM üçün çox vacibdir, lakin disk müvəqqəti masalar üçün istifadə olunur.
    • INNODB STATUSUNUZU izləyin
    • Serverinizin çox vaxtını hansı sorğular alır?
    • Müvəqqəti cədvəllər, xüsusən böyük müvəqqəti cədvəllər yaradılıb?
    • Tətbiqiniz əməliyyatlardan istifadə edirmi? Sorğuları autocommit = 1 ilə işlətdiyiniz zaman (MySQL-ə uyğun olaraq), hər əlavə / yeniləmə sorğusu bir az yük verən yeni əməliyyata başlayır. Mümkünsə, autocommit-i (python-da MySQL sürücüsünün avtomatik komutu varsayılan olaraq söndürülür) söndürmək və bütün dəyişikliklər edildikdən sonra əl ilə icra etmək daha yaxşıdır.
    • Tətbiqiniz eyni cədvəldə bir döngədə bir sıra əlavələr edirmi? Data infile əmri yükləmə seriyası üçün daha sürətli olur.
    • Unutmayın: cədvəldən say (*) seçin, innodb üçün myisamdan daha yavaşdır.
    • Hansı INSERT / UPDATE sorğuları server vaxtının çox hissəsini alır? Onları necə optimallaşdırmaq olar?
    • DB-də uyğun indekslərin olub olmadığını yoxlayın və lazım olduqda əlavə edin.

    Ətrafımızda vəziyyətimiz var idi, bir növ yeniləmə sorğusu yavaş idi. Toplu işi bitirmək üçün təxmini müddət 2 gün idi. Yavaş sorğu jurnalını təhlil etdikdən sonra bu tip yeniləmə sorğusunun tamamlanması üçün 4 saniyə lazım olduğunu gördük. Sorğu belə oldu: yeniləmə table1 set field1 = value1 burada table1.field2 = xx table2.field3 = yy və table2.field4 = zz. Yeniləmə sorğusunu sorğu seçmək üçün konvertasiya etdikdən və seçdiyimiz sorğuda izah etdikdən sonra bu tip sorğunun indeksdən istifadə etmədiyini izah etdik. Müvafiq indeks yaratdıqdan sonra yeniləmə sorğusu icra müddətini milisaniyəyə endirdik və bütün iş iki saatdan az müddətdə bitdi.


    SQL Server Qiymətləndirmə Script

    Nəhayət arxa brülör layihəsi siyahısından bir maddəni keçməyə başladım. Keçən fevral ayında buluta köçmək üçün bütün SQL Server verilənlər bazası izlərini qiymətləndirən bir müştəriydim. Əvvəllər bu cür işi görməmişəm, hər bir verilənlər bazasına əsas baxış verən skriptləri tez bir zamanda birləşdirdim. Sonra nəticələri bir cədvəldə birləşdirdim.

    Bu məlumatları tək bir skriptlə əldə etmək yaxşı olmazdımı? Bu skriptdən yalnız SQL Server nümunənizdə qaynaq istifadəsini daha yaxşı başa düşmək üçün deyil, həm də başqa bir cihaza və ya buluda köçmək üçün lazımlı mənbələri müəyyən etmək üçün istifadə edə bilərsiniz.

    Artıq bir az məlumat verən uzun bir sağlamlıq müayinəsi skriptini hazırladım (burada). Bununla birlikdə, müəyyən bir müddət ərzində CPU istifadəsi və IOPS dəyərləri ölçməmişdir. Yeni SQL Server qiymətləndirmə skriptim yalnız sağlamlıq yoxlama skriptimdən daha kiçik, lakin daha vacib bir məlumat dəsti toplamaqla yanaşı, bir gün ərzində fərdi oxuma və yazma dəyərləri daxil olmaqla CPU istifadəsi və IOPS dəyərlərinin saatlıq anlıq görüntülərini də alır. Bu ssenarini normal bir iş günü və ya varsa, ayın sonu müddətində icra edin.

    Budur ssenari son formada. CPU və IOPS anlıq şəkillərini və anlar arasındakı aralığı tənzimləmək üçün bu iki sətri düzəldin:

    while (@cntr) & lt 24 & # 8211 Bu nəticələr çıxmazdan əvvəl çəkiləcək anların sayıdır.

    waitfor delay & # 821701: 00: 00 & # 8242 & # 8211 Bu anlar arasında vaxt gecikməsidir. Hal-hazırda bir saat təyin edilmişdir.


    Videoya baxın: How connect to an Oracle database from Python