Az Azure Table Storage és az Azure Cosmos DB Table API használatának első lépései az F használatával#

Az Azure Table Storage egy olyan szolgáltatás, amely strukturált NoSQL-adatokat tárol a felhőben. A Table Storage egy séma nélküli kulcs-/attribútumtár. Mivel a Table Storage séma nélküli, az adatokat könnyen az alkalmazás változó igényeihez igazíthatja. Az adatok hozzáférése gyors és költséghatékony, bármilyen alkalmazásról legyen is szó. Hasonló adatmennyiséggel számolva a Table Storage általában határozottan kevesebb költséggel jár, mint egy hagyományos SQL.

A Table Storage segítségével rugalmas adatkészleteket tárolhat, például webalkalmazások felhasználói adatait, címtárakat, eszközadatokat és bármilyen egyéb metaadatot, amelyre a szolgáltatásnak szüksége van. Egy táblán korlátlan számú entitást tárolhat, és egy tárfiók a kapacitásán belül korlátlan számú táblát tartalmazhat.

Az Azure Cosmos DB biztosítja a Table API-t az Azure Table Storage-hoz írt és prémium szintű képességeket igénylő alkalmazásokhoz, például:

  • Kulcsrakész globális terjesztés.
  • Dedikált teljesítmény világszerte.
  • Az esetek 99%-ában egyszámjegyű ezredmásodperces késés.
  • Garantáltan magas szintű rendelkezésre állás.
  • Automatikus másodlagos indexelés.

Az Azure Table Storage-hoz írt alkalmazások kódmódosítások nélkül migrálhatók az Azure Cosmos DB-be a Table API használatával, és kihasználhatják a prémium szintű képességek előnyeit. A Table API ügyféloldali SDK-kkal rendelkezik a .NET, a Java, a Python és a Node.js számára.

További információ: Bevezetés az Azure Cosmos DB Table API használatába. Ezen oktatóanyagok az Azure-val való hitelesítéshez kapcsolati sztringeket használnak. Az optimális biztonság érdekében a Microsoft Entra ID-t kell használnia felügyelt identitásokkal.

Az oktatóanyag ismertetése

Ez az oktatóanyag bemutatja, hogyan írhat F#-kódot az Azure Table Storage vagy az Azure Cosmos DB Table API használatával végzett gyakori feladatok elvégzéséhez, beleértve a táblák létrehozását és törlését, valamint a táblaadatok beszúrását, frissítését, törlését és lekérdezését.

Előfeltételek

Az útmutató használatához először létre kell hoznia egy Azure Storage-fiókot vagy egy Azure Cosmos DB-fiókot.

F#-szkript létrehozása és az F# interaktív indítása

A cikkben szereplő minták F#-alkalmazásokban vagy F#-szkriptekben is használhatók. F#-szkript létrehozásához hozzon létre egy fájlt a .fsx kiterjesztéssel, tables.fsxpéldául az F# fejlesztői környezetben.

Szkriptek végrehajtása

Az F# Interactive dotnet fsiinteraktívan indítható el, vagy elindítható a parancssorból egy szkript futtatásához. A parancssori szintaxis a következő:

> dotnet fsi [options] [ script-file [arguments] ]

Csomagok hozzáadása szkriptben

Ezután telepítse a Azure.Data.Tables csomagot és a open névtereket. Például

> #r "nuget: Azure.Data.Tables"
open Azure.Data.Tables

Névtér-deklarációk hozzáadása

Adja hozzá a következő open utasításokat a tables.fsx fájl elejéhez:

open System
open Azure
open Azure.Data.Tables // Namespace for Table storage types

Azure Storage-kapcsolati sztring lekérése

Ha az Azure Storage Table szolgáltatáshoz csatlakozik, ehhez az oktatóanyaghoz szüksége lesz a kapcsolati karakterláncra. A kapcsolati karakterláncot az Azure portálról másolhatja. Az összekapcsolási sztringekkel kapcsolatos további információkért lásd: A tárolási kapcsolati sztringek konfigurálása.

Szerezze meg az Azure Cosmos DB kapcsolati sztringet

Ha az Azure Cosmos DB-hez csatlakozik, ehhez az oktatóanyaghoz szükség lesz a kapcsolati karakterláncra. A kapcsolati sztringet az Azure portalról másolhatja. Az Azure Portal Cosmos DB-fiókjában lépjen a Beállítások>kapcsolati sztringre, és válassza a Másolás gombot az elsődleges kapcsolati sztring másolásához.

Az oktatóanyaghoz írja be a kapcsolati karakterláncot a szkriptjébe, például a következő módon:

let storageConnString = "..." // fill this in from your storage account

A table service-ügyfél létrehozása

Az TableServiceClient osztály lehetővé teszi táblák és entitások lekérését a Table Storage-ban. A szolgáltatásügyfél létrehozásának egyik módja:

let tableClient = TableServiceClient storageConnString

Most már készen áll a Table Storage-ból adatokat olvasó és abba adatokat író kód írására.

Tábla létrehozása

A példa bemutatja, hogyan hozhat létre táblát, ha még nem rendelkezik vele:

// Retrieve a reference to the table.
let table = tableClient.GetTableClient "people"

// Create the table if it doesn't exist.
table.CreateIfNotExists () |> ignore

Entitás hozzáadása a táblához

Az entitásnak egy típussal kell rendelkeznie, amely ITableEntity-t implementál. Tetszés szerint bővíthető ITableEntity , de a típusnak paraméter nélküli konstruktorsal kell rendelkeznie. Az Azure-tábládban csak azok a tulajdonságok vannak tárolva, amelyek mindkettőt tartalmazzák: get és set.

Az entitás partíciója és sorkulcsa egyedileg azonosítja a táblában lévő entitást. Az azonos partíciókulcsú entitások gyorsabban lekérdezhetők, mint a különböző partíciókulcsúak, de az eltérő partíciókulcsok használata a párhuzamos műveletek nagyobb méretezhetőségét teszi lehetővé.

Íme egy példa egy Customer olyan példára, amely a lastName partíciókulcsot és a firstName sorkulcsot használja.

type Customer (firstName, lastName, email: string, phone: string) =
    interface ITableEntity with
        member val ETag = ETag "" with get, set
        member val PartitionKey = "" with get, set
        member val RowKey = "" with get, set
        member val Timestamp = Nullable() with get, set

    new() = Customer(null, null, null, null)
    member val Email = email with get, set
    member val PhoneNumber = phone with get, set
    member val PartitionKey = lastName with get, set
    member val RowKey = firstName with get, set

Adja hozzá Customer a táblához. Ehhez használhatjuk az AddEntity() metódust.

let customer = Customer ("Walter", "Harp", "Walter@contoso.com", "425-555-0101")
table.AddEntity customer

Entitásköteg beszúrása

Egyetlen írási művelettel entitásköteget szúrhat be egy táblába. A Batch-műveletek lehetővé teszik a műveletek egyetlen végrehajtásba való egyesítését, de bizonyos korlátozások vonatkoznak rájuk:

  • Ugyanabban a kötegműveletben frissítéseket, törléseket és beszúrásokat hajthat végre.
  • A kötegművelet legfeljebb 100 entitást tartalmazhat.
  • A kötegművelet összes entitásának ugyanazzal a partíciókulcszal kell rendelkeznie.
  • Bár egy kötegműveletben lehet lekérdezést végrehajtani, a kötegben csak ez lehet az egyetlen művelet.

Íme néhány kód, amely két beszúrást egyesít egy kötegműveletben:

let customers =
    [
        Customer("Jeff", "Smith", "Jeff@contoso.com", "425-555-0102")
        Customer("Ben", "Smith", "Ben@contoso.com", "425-555-0103")
    ]

// Add the entities to be added to the batch and submit it in a transaction.
customers
|> List.map (fun customer -> TableTransactionAction (TableTransactionActionType.Add, customer))
|> table.SubmitTransaction

Egy partíció összes entitásának lekérése

Ha egy partíció összes entitásához szeretne táblát lekérdezni, használjon egy objektumot Query<T> . Itt szűrheti azokat az entitásokat, ahol a "Smith" a partíciókulcs.

table.Query<Customer> "PartitionKey eq 'Smith'"

Entitások tartományának lekérése egy partícióban

Ha nem szeretné az összes entitást lekérdezni egy partícióból, megadhat egy tartományt a partíciókulcs és a sorkulcs szűrőjének kombinálásával. Itt két szűrővel lekérheti az összes entitást a "Smith" partícióban, ahol a sorkulcs (utónév) az "M" betűnél korábbi betűvel kezdődik az ábécében.

table.Query<Customer> "PartitionKey eq 'Smith' and RowKey lt 'J'"

Egyetlen entitás lekérdezése

Egy adott entitás lekéréséhez használja a GetEntityAsync a "Ben Smith" ügyfél megadásához. Gyűjtemény helyett egy Customer kapsz vissza. Ha a partíciókulcsot és a sorkulcsot is megadja egy lekérdezésben, az a leggyorsabb módja annak, hogy egyetlen entitást lekérjen a Table service-ből.

let singleResult = table.GetEntity<Customer>("Smith", "Ben").Value

Most kinyomtatja az eredményeket:

// Evaluate this value to print it out into the F# Interactive console
singleResult

Entitás frissítése

Egy entitás frissítéséhez kérje le a Table szolgáltatásból, módosítsa az entitásobjektumot, majd mentse a módosításokat a Table szolgáltatásba egy TableUpdateMode.Replace művelettel. Ez azt eredményezi, hogy az entitás teljes mértékben lecserélődik a kiszolgálón, kivéve, ha a kiszolgálón lévő entitás megváltozott a lekérése óta, amely esetben a művelet meghiúsul. Ez a hiba megakadályozza, hogy az alkalmazás véletlenül felülírja a módosításokat más forrásokból.

singleResult.PhoneNumber <- "425-555-0103"
try
    table.UpdateEntity (singleResult, ETag "", TableUpdateMode.Replace) |> ignore
    printfn "Update succeeded"
with
| :? RequestFailedException as e ->
    printfn $"Update failed: {e.Status} - {e.ErrorCode}"

Entitás létrehozása vagy frissítése

Néha nem tudja, hogy létezik-e entitás a táblában. És ha igen, akkor a benne tárolt aktuális értékekre már nincs szükség. A metódussal UpsertEntity létrehozhatja vagy lecserélheti az entitást, ha létezik, függetlenül annak állapotától.

singleResult.PhoneNumber <- "425-555-0104"
table.UpsertEntity (singleResult, TableUpdateMode.Replace)

Az entitástulajdonságok egy részének lekérdezése

A tábla lekérdezések csak néhány tulajdonságot tudnak lekérni egy entitásból az összes helyett. Ez a leképezésnek nevezett technika javíthatja a lekérdezési teljesítményt, különösen a nagy entitások esetében. Itt csak az e-mail-címeket adja vissza a Query<T> és Select használatával. A helyi tárolóemulátor nem támogatja a kivetítés használatát, ezért ez a kód csak akkor fut, ha a Table szolgáltatásban használ fiókot.

query {
    for customer in table.Query<Customer> () do
    select customer.Email
}

Oldalak entitásainak aszinkron lekérése

Ha sok entitást olvas el, és ahelyett, hogy megvárná, amíg mind visszaérkezik, szegmentált lekérdezést használhat. Itt egy aszinkron munkafolyamattal adjuk vissza az eredményeket lapokban, annak érdekében, hogy a végrehajtás ne legyen blokkolva, miközben egy nagy mennyiségű eredmény visszaérkezése közben várunk.

let pagesResults = table.Query<Customer> ()

for page in pagesResults.AsPages () do
    printfn "This is a new page!"
    for customer in page.Values do
        printfn $"customer: {customer.RowKey} {customer.PartitionKey}"

Entitás törlése

Miután lekérte az entitást, törölheti azt. Az entitás frissítéséhez hasonlóan ez is meghiúsul, ha az entitás a lekérése óta módosult.

table.DeleteEntity ("Smith", "Ben")

Tábla törlése

Egy táblát törölhet egy tárfiókból. A törölt táblák a törlést követően egy ideig nem hozhatók létre újra.

table.Delete ()

Lásd még