Python: przypisanie wartości w słowniku a metoda setdefault

2019-05-06

Popatrz – wynik obu skryptów jest taki sam:

country_leader = { 'DE' : 'Merkel' , 'PL' : 'Szydlo'}
country_leader['FR'] = 'Macron'
print(country_leader)
country_leader = { 'DE' : 'Merkel' , 'PL' : 'Szydlo'}
country_leader.setdefault('FR','Macron')
print(country_leader)

dlaczego? Bo ‚FR’ na oryginalnej liście nie było.  Zarówno przypisanie, jak i setdefault dodaje nowy kraj z jego leaderem.

Ale w następnym przykładzie jest inaczej. Tutaj zmieniamy Szydło na Morawiecki dla PL. Zapis dla PL już był i to polecenie dokonało zmian – Szydło zamienia się na Morawiecki:

country_leader = { 'DE' : 'Merkel' , 'PL' : 'Szydlo'}
country_leader['PL'] = 'Morawiecki'
print(country_leader)

ale tutaj instruujemy Pythona, że należy dodać zapis PL jeśli go tam nie ma i zainicjować go ‚Morawiecki’

country_leader = { 'DE' : 'Merkel' , 'PL' : 'Szydlo'}
country_leader.setdefault('PL', 'Morawiecki')
print(country_leader)

Sęk w tym, że PL było na oryginalnej liście, więc nie dodaliśmy PL i nie wpisaliśmy ‚Morawiecki’. Została Szydło.

Kiedy używać setdefault?

Korzystanie z setdefault jest best practice zamiast takiego kodu, który osobno sprawdza, czy PL jest na liście i jeśli nie, to dodaje taki zapis. setdefault pozwala to zrobić w jednym kroku!

country_leader = { 'DE' : 'Merkel' , 'PL' : 'Szydlo'}
if 'PL' not in country_leader:
    country_leader['PL'] = 'Morawiecki'
print(country_leader)
By Rafał Kraik in Python

SQL: SSIS: Pełny transaction log wywołany przez SSIS Server Maintenance Job

2019-05-03

Jeśli na serwerze z zainstalowaną usługą SSIS I bazą danych SSISDB znajdziesz job „SSIS Server Maintenance Job” w statusie failed, a w error logu dodatkowo odnajdziesz informacje o pełnym logu transakcyjnym tej bazy, to masz przed sobą nieco pracochłonny process, jednak sprawa jest do opanowania!

Skoro log transakcyjny się zapełnia to transakcje są za duże. Trzeba je więc zmiejszyć… Oto jak:

Zajrzyjmy najpierw do joba. Ma on 2 job steps:

Każdy job step to po prostu wywołanie procedury:

EXEC [internal].[cleanup_server_retention_window]

Procedury rozpoczynają się od pobrania parametrów:

SELECT @retention_window_length = CONVERT(int,property_value)
FROM [catalog].[catalog_properties]
WHERE property_name = ‚RETENTION_WINDOW’

Oczywiście prarametry te wpływają na to ile danych będzie kasowanych. No więc, chyba mamy rozwiązanie!

Wystarczy odczytać aktualną wartość parametru np. „RETENTION_WINDOW”, zamapiętać ją (bo na koniec chcemy wrócić do oryginalnej wartości), zmienić na większą (lub mniejszą w zależności od tego jaki parameter zmieniasz – ale zawsze chodzi nam o kasowanie mniejszej ilości danych). Po zmianie uruchomić procedure – nawet niekoniecznie z joba, można po prostu uruchoamiać wybraną procedure I możliwości są dwie:

-jeśli się udało – zmieniamy wartość parametru na bliższą wartości oryginalnej

-jeśli się nie udalo – zmieniamy wartość parametru na dalszą od wartości oryginalnej

 

 

By Rafał Kraik in SQL

Windows Server: Cluster: Disk problem: Clear-ClusterDiskReservation

2019-04-27

Podczas przełączenia clustra windows 2016 stało się coś dziwnego. Wskutek z grubsze nieznanej przyczyny wypadł jeden z dysków. Sytuację udało się naprawić, cluster był już sprawny, ale jeden ze starych dysków clustra przestał być widoczny…

  • diskpart widziamontowania pod literę dysku pojawiał się błąd:
DISKPART> assign letter k
There is no volume specified.
Please select a volume and try again.
  • podobnie działo się przy korzystaniu z narzędzi graficznych – dysk był raportowany jako RAW i nie można było usyskać dostępu do jego danych
  • podczas dodawania dysku do available storage pojawiał się komunikat mówiący, że nie ma dysków dostępnych do dodania

Czytaj dalej »

SQL: Uzyskiwanie nazwy instancji SQL w job SQL Agent

2019-04-25

Największą trudnością w automatyzowaniu administracji jest takie napisanie skryptu, które pozwoli uruchamiać dany skrypt w dowolnym środowisku bez modyfikacji.

Tym razem napisałem skrypt w powershellu, który można uruchamiać w jobie SQL Agent. Jedno z zadań tego skryptu było podłączenie się do BIEŻĄCEJ instancji SQL i wykonanie update na tabeli. Po cichu założyłem sobie, że kiedy agent uruchamia job typu powershell i wykonuje polecenie:

Invoke-SQLCmd $query

to połączenie zostanie wykonane do BIEŻĄCEJ instancji. Niestety. Połaczenie było wykonywane do DOMYŚLNEJ instancji. Kiedy więc mój skrypt uruchomił się na instancji nazwanej – dochodziło do błędu Login Failed…

Jest na to rada. Można korzystać z dostępnych zmiennych. W skrypcie powershell dodałem na początku:

$serverInstance = "$(ESCAPE_DQUOTE(SRVR))"

a potem wykonując update na bazie danych:

Invoke-SQLCmd $query -ServerInstance $serverinstance

I znowu wszystko się udało 🙂

SQL: Error 14274: Cannot add, update, or delete a job (or its steps or schedules) that originated from an MSX server

2019-04-24

A to ci dopiero!

Mój skrypt powinien utworzyć job-y jeden po drugim. Szczerze mówiąc, poszczególne joby zostały wyklikane w interfejsie graficznym, a potem zeskryptowane i połączone w jeden duży skrypt. Poczas uruchamiania tego dużego skrptu pojawiał się błąd:

Msg 14274, Level 16, State 1, Procedure msdb.dbo.sp_add_job, Line 132

Cannot add, update, or delete a job (or its steps or schedules) that originated from an MSX server.

Kluczowe w tym błędzie są następujące objawy:

  • Tworzenie joba za pomocą osobnego skryptu udaje się bez problemu
  • Tworzenie joba w ramach jednego skryptu kończy się błędem

To jednoznacznie wskazuje, że błąd jest związany z wartością zmiennych, które zmieniają swoją wartość podczas tworzenia pierwszego joba. Szczęśliwie tych zmiennych nie ma za wiele. Dodanie następującej linijki tuż przed procedurą sp_add_job rozwiązało problem:

SET @jobId = NULL

 

By Rafał Kraik in SQL

Powershell – uzyskiwanie nazwy dnia tygodnia

2019-03-29

Chcesz wydobyć z daty nazwę dnia tygodnia? No problem!

Zobacz następujące propozycje:

PS C:\> get-date -format "dddd"
piątek
PS C:\> get-date | select -expand dayofweek
Friday
PS C:\> (get-date).DayOfWeek
Friday
PS C:\> (get-date).ToString("dddd")
piątek

Teraz wynik takiego polecenia wystarczy zapisać do zmiennej i gotowe, np.:

$dayOfWeek =  (get-date).ToString("dddd")
By Rafał Kraik in Power Shell

Kurs MS Excel Tips & Tricks – za darmo przez pewien czas ;)

2019-03-27

Od dzisiaj na platformie Udemy jest dostępny nasz nowy kurs „MS Excel Tips & Tricks

Jak zwykle przez pewien czas kurs jest dostępny za darmo. To takie „dziękuję” za wszystkie porady znajdowane na blogach, forach, filmach w chwili kiedy sam nie potrafię sobie z czymś poradzić.

A co w tym kursie? Dokładny spis treści znajduje się poniżej. Do każdego filmu do dyspozycji jest zadanie do samodzielnego rozwiązania razem z plikami ćwiczeniowymi, jeśli akurat są potrzebne. Jeśli więc masz ochotę – zapraszam do nauki! Czytaj dalej »

By Rafał Kraik in Aktualności