Post ASPC45srJJA6PBMQ52 by nogoommethalya@write.tchncs.de
 (DIR) More posts by nogoommethalya@write.tchncs.de
 (DIR) Post #ALeYtUbaDCQv8irKca by beandev@write.tchncs.de
       2022-07-19T15:12:46.698541Z
       
       0 likes, 0 repeats
       
       EinleitungDieser Blogartikel ist dafür gedacht, eine fortlaufende Liste an Crates zu beschreiben, die Zugriffe auf Persistenzen erlauben. Die Liste wird über die Zeit aktualisiert.TreiberPostgreSQLPostgres ist eine sehr beliebte RDBMS Datenbank.Postgres (postgres)Rust docs: https://docs.rs/postgres/latest/postgres/Repository: https://github.com/sfackler/rust-postgresAsync: Nein, SSL/TLS: Ja, Native: JaTokio PostgreSQL (tokio_postgres)Rust docs: https://docs.rs/tokio-postgres/latest/tokio_postgres/Repository: https://github.com/sfackler/rust-postgresAsync: Ja (pipelining), SSL/TLS: Ja, Native: JaMySQLMySQL ist eine sehr beliebte RDBMS Datenbank und die erste Wahl für die meisten Anwendungen, die eine SQL-Datenbank verwenden. MySQL (mysql)Rust docs: https://docs.rs/mysql/latest/mysql/Repository: https://github.com/blackbeam/rust-mysql-simpleAsync: Nein, SSL/TLS: Ja (via nativetls oder rustls), Native: JaMySQL Async (mysql_async)Rust docs: https://docs.rs/mysql_async/latest/mysql_async/Repository: https://github.com/blackbeam/mysql_asyncAsync: Ja, SSL/TLS: Ja, Native: JaSQLiteSQLite ist eine prozessinterne Datenbank mit SQL-Unterstützung, die von mehreren Plattformen für die Verwaltung von Datenspeichern verwendet wird.Rust sqlite (rusqlite)Rust docs: https://docs.rs/rusqlite/latest/rusqlite/Repository: https://github.com/rusqlite/rusqliteAsync: Nein, SSL/TLS: Nein, Native: NeinMongoDBMongoDB (mogodb)Rust docs: https://docs.rs/mongodb/latest/mongodb/Repository: https://github.com/mongodb/mongo-rust-driverAsync: Ja (tokio oder async-std), SSL/TLS: Ja (openssl), Native: JaMS SQLDer Microsoft SQL Server ist ein relationales Datenbankmanagementsystem von Microsoft. Microsoft SQL Server. Tiberius TDS Client (tiberius)Rust docs: https://docs.rs/tiberius/latest/tiberius/Repository: https://github.com/prisma/tiberiusAsync: Ja (tokio, async-std, smol), SSL/TLS: Ja (native-tls, rustls, openssl), Native: JaOracleOracle Database (auch Oracle Database Server, Oracle RDBMS) ist eine Datenbankmanagementsystem-Software des Unternehmens Oracle.Sibyl (sibyl)Rust docs: https://docs.rs/sibyl/latest/sibyl/Dokumentation: https://quietboil.github.io/sibyl/Repository: https://github.com/quietboil/sibylAsync: Ja (tokio, async-std, actix), SSL/TLS: Nein, Native: JaRedisRedis ist eine In-Memory-Datenbank, die für die Erstellung von Caches, Worker Queues und Microservices verwendet werden kann. Das Redis-Crate bietet sowohl High-Level- als auch Low-Level-APIs. Alle Abfragen sind pipelined, was bedeutet, dass mehrere Abfragen gleichzeitig gesendet werden können.Redis-rs (redis)Rust docs: https://docs.rs/redis/latest/redis/Repository: https://github.com/redis-rs/redis-rsAsync: Ja (via tokio oder async-std, unterstützt pipelining), SSL/TLS: Ja, Native: JaLevelDBLevelDB wurde von Google entwickelt und ist ein reiner Key-Value-Speicher. Google LevelDB (leveldb)Rust docs: https://skade.github.io/leveldb/leveldb/Repository: https://github.com/skade/leveldbAsync: Nein, SSL/TLS: Nein, Native: NeinMemCacheMemcached ist ein freies, quelloffenes, hochleistungsfähiges Caching-System für verteilte Speicherobjekte. memcache ist ein in reinem Rust geschriebener Memcached-Client. Er unterstützt mehrere Instanzen von Memcached. Einige Funktionen, einschließlich der automatischen JSON-Serialisierung und Komprimierung, sind noch nicht verfügbar.MemCache (memcache)Rust docs: https://docs.rs/memcache/latest/memcache/Repository: https://github.com/aisk/rust-memcacheAsync: Nein, SSL/TLS: Ja, Native: JaCassandra / ScyllaDBCassandra ist eine verteilte, skalierbare SQL-Datenbank. crdrs ist ein Datenbanktreiber für Cassandra und ScyllaDB.CD-rs (cdrs)Rust docs: https://docs.rs/cdrs/latest/cdrs/Repository: https://github.com/AlexPikalov/cdrsAsync: Nein, SSL/TLS (via nativetls): Ja, Native: JaCD-rs Async (cdrs-async)Rust docs: https://docs.rs/cdrs-async/0.1.0-alpha.0/cdrs_async/Repository: https://github.com/AlexPikalov/cdrs-asyncAsync: Ja (via async-std), SSL/TLS: Ja (via nativetls), Native: JaElasticSearchElasticSearch ist im Prinzip keine Datenbank, sondern ein invertierter Suchindex basierend auf JSON Dokumenten.Elasticsearch-rs (elasticsearch)Rust docs: https://docs.rs/elasticsearch/latest/elasticsearch/Repository: https://github.com/elastic/elasticsearch-rsAsync: Ja (via tokio), SSL/TLS: Ja (via nativetls oder rustls), Native: JaOpenSearchOpenSearch ist ein Fork von ElasticSearch und ist damit auch keine Datenbank, sondern ein invertierter Suchindex basierend auf JSON Dokumenten.Opensearch-rs (opensearch)Rust docs: https://docs.rs/opensearch/latest/opensearch/Repository: https://github.com/opensearch-project/opensearch-rsAsync: Ja (via tokio), SSL/TLS: Ja (via nativetls oder rustls), Native: JaODBCDie Odbc-Schnittstelle (Microsoft Open Database Connectivity) ist eine C-Programmiersprachenschnittstelle, mit der Anwendungen auf Daten aus einer Vielzahl von Datenbankverwaltungssystemen (DATABASE Management Systems, DBMSs) zugreifen können. ODBC ist eine Low-Level-Schnittstelle, die speziell für RDBMS entwickelt wurde.ODBC Treiber greifen also nicht auf eine spezifische Datenbank zu, sondern bieten eine API für ODBC-fähige Datenbanken.ODBC-sys (odbc-sys)Rust docs: https://docs.rs/odbc-sys/latest/odbc_sys/Repository: https://github.com/pacman82/odbc-sysAsync: Nein, SSL/TLS: Nein, Native: Nein (FFI)ODBC-api (odbc-sys) Info: Abstraktions-Schicht zu ODBC-sysRust docs: https://docs.rs/odbc-api/latest/odbc_api/Repository: https://github.com/pacman82/odbc-apiAsync: Nein, SSL/TLS: Nein, Native: Nein (FFI via ODBC-sys)SQL AbstraktionenCornucopia (cornucopia)Cornucopia ist ein kleines CLI-Programm, das auf tokio-postgres aufbaut, um PostgreSQL-Workflows in Rust zu erleichtern.Cornucopia wandelt PostgreSQL-Abfragen in Rust Code um. Jede Abfrage wird gegen das Schema vorbereitet, um sicherzustellen, dass die Statements gültiges SQL sind. Diese Prepared Statements werden dann verwendet, um typ-geprüften Rust-Code für die Abfragen zu erzeugen.Das Framework ist kein OR-Mapper, sondern ein Sourcecode Generator für SQL Statements.Hat man folgendes Schema:CREATE TABLE Author (    Id SERIAL NOT NULL,    Name VARCHAR(70) NOT NULL,    Country VARCHAR(100) NOT NULL,    PRIMARY KEY(Id));Und diese annotierte SQL Anweisung:--! authors()*SELECT * FROM Author;generiert sich folgende Rust Funktion:pub async fn authors<T: GenericClient>(client: &T) -> Result<Vec<(i32, String, String)>, Error> {    let stmt = client        .prepare("SELECT*FROMAuthor;",        )        .await?;    let res = client        .query_raw(&stmt, std::iter::empty::<i32>())        .await?        .map(|res| {            res.map(|res| {                let return_value_0: i32 = res.get(0);                let return_value_1: String = res.get(1);                let return_value_2: String = res.get(2);                (return_value_0, return_value_1, return_value_2)            })        })        .try_collect()        .await?;    Ok(res)}Damit wird eine Menge Boilerplate Implementierung an den Code-Generator ausgelagert und in der Entwicklung muss man sich nicht mehr damit rumschlagen.BewertungCornucopia fokussiert sich auf die Codegenerierung durch annotierte SQL Statements und macht dies ausschließlich für tokio-postgres. Vorteil ist, dass man keine Makros hat und der generierte Code exakt zum DB Schema passt, Async Tokio von Haus aus beherrscht und Connection Pooling via deadpool-postgress einbindet. Damit ist es nur für ganz bestimmte Lösungen geeignet, erfreut sich aber einer begeisterten Anhängerschaft. FähigkeitenTreiberTokio PostgreSQL (Rust safe)AsyncJa (tokio)TLS/SSLÜber den Tokio PostgreSQL TreiberRessourcenCrate: https://crates.io/crates/cornucopiaRepository: https://github.com/cornucopia-rs/cornucopiaCLI Dokumentation: https://github.com/cornucopia-rs/cornucopia/blob/main/cli.mdSQLxSQLx ist eine SQL Abstraktions-Bibliothek, um sichere SQL Abfragen, unabhängig der darunter liegenden Datenbank zu schreiben. Typischerweise sind die Abfragen laufzeit-dynamisch, da alle Bezeichner als Strings deklariert werden. SQLx überprüft nicht die Syntax der generierten SQL Statements. D.h. es ist durchaus möglich, fehlerhaften SQL mit SQLx zu generieren. Applikationen mit SQLx benötigen deswegen eine optimale Testabdeckung. Zusätzlich hat SQLx eine Statement Verifikation zur Compiler-Zeit. Die Abstraktion ist sehr Low-Level, wie das folgende Beispiel zeigt:#[derive(sqlx::FromRow)]struct User { name: String, id: i64 }let mut stream = sqlx::query_as::<_, User>(        "SELECT * FROM users WHERE email = ? OR name = ?")    .bind(user_email)    .bind(user_name)    .fetch(&mut conn);BewertungSQLx ist ein ausgezeichnetes Framework zur flexiblen Erzeugung von SQL Statements, das kaum einschränkt und dazu eine große Treiberunterstützung (sogar mit zwei Rust Treibern) bietet sowie Async und TLS nutzen kann. Jenseits der Verifikation während des Compile-Vorgangs ist man aber auf sich und die eigene Testabdeckung angewiesen. Benötigt man eine zusätzliche Abstraktion, solle man sich SeaQuery oder gar SeaORM anschauen, die beide auf SQLx basieren. FähigkeitenTreiberSQlitePostgreSQL (Rust safe)MySQL (Rust safe)MS SQLAsyncJa (actix, async-std und tokio)Transport Layer SecurityFür Postgres und MySQLRessourcenRepository: https://github.com/launchbadge/sqlxRust Doc: https://docs.rs/sqlx/latest/sqlx/SeaQL / SeaQuerySeaQuery ist ein dynamischer Query Builder, der SQLx nutzt. Damit bietet SeaQuery eine sichere Typisierung, als es SQLx bietet. Die Bezeichner der SQL Elemente werden über Enums mit Traits implementiert, indem die Enums zu den String-Bezeichnern mit pattern matching zugewiesen werden (was über ein derive automatisiert werden kann). Der QueryBuilder arbeitet dann nicht mehr mit Strings, sondern nur mit den Enums, die Anwendern schon zur Compile-Zeit eine Fehlerprüfung auf korrekte Bezeichner bietet. Eine Abfrage sieht dann so aus:assert_eq!(    Query::select()        .column(Glyph::Id)        .from(Glyph::Table)        .cond_where(            Cond::any()                .add(                    Cond::all()                        .add(Expr::col(Glyph::Aspect).is_null())                        .add(Expr::col(Glyph::Image).is_null())                )                .add(                    Cond::all()                        .add(Expr::col(Glyph::Aspect).is_in(vec![3, 4]))                        .add(Expr::col(Glyph::Image).like("A%"))                )        )        .to_string(PostgresQueryBuilder),    [        r#"SELECT "id" FROM "glyph""#,        r#"WHERE"#,        r#"("aspect" IS NULL AND "image" IS NULL)"#,        r#"OR"#,        r#"("aspect" IN (3, 4) AND "image" LIKE 'A%')"#,    ]    .join(" "));BewertungWenn man sich nicht mit Schreibfehlern an zig verschiedenen Stellen im Sourecode rumschlagen will, ist SeaQuery eine sehr gute Abstraktion für SQLx. Damit wird die Deklaration der Bezeichner an einem zentralen Punkt der Schema-Definition festgelegt und man umgeht die fehlerträchtigen String Konstanten. Mit dem Iden-derive-Makro wird das Mapping der Bezeichner sogar automatisiert. Ansonsten kann man mit SeaQuery alles machen, was man von SQLx gewohnt ist. Die zusätzliche Indirektion über die Enums ist zwar etwas aufwendiger, aber der Gewinn an korrekten Code ist damit aufgewogen. Aber auch für SeaQuery gilt, dass keinerlei Prüfung gegen echte DB Schemata gemacht wird. D.h., was als Deklaration festgelegt wird, muss nichts mit dem DB-Schema zur Laufzeit zu tun haben. Es erlaubt eine hohe Flexibilität, fordert aber auch weiterhin eine umfangreiche Testabdeckung.FähigkeitenTreibersqlx-mysql (Rust safe)sqlx-postgres  (Rust safe)sqlx-sqlitepostgrespostgres-*rusqliteRessourcenRepository: https://github.com/SeaQL/sea-queryDokumentation: https://www.sea-ql.org/SeaORM/docs/index/Object Relational Modeling (ORM)Es gibt nicht viele Multi-DB ORM Crates, aber die wenigen lassen sich gut produktiv einsetzen und sind auch keine Konkurrenz zueinander, sondern bilden ganz eigene Paradigmen ab. Ansonsten gibt es Projekte, wie Sand am Meer, die für spezifische Datenbanken ORM-Funktionalitäten anbieten. Diese habe ich hier aber nicht betrachtet.DieselDiesel ist ein statisches ORM Builder System, das darauf abzielt, schon zur Compiler-Zeit ein vollständiges OR-Mapping durchzuführen. Die Makros sind auf typische Spaltenzahlen für Tabellen konfigurierbar. Wenn man z.B. mehr als 32 Spalten benötigt, muss man die Konfiguration anpassen, was aber auch die Compiler-Zeit verlangsamt. Spalten werden als Structs modelliert und erhalten Traits, um die Predicates zu deklarieren. Abfragen in Diesel bieten eine gute Abstraktion:let versions = Version::belonging_to(krate)  .select(id)  .order(num.desc())  .limit(5);let downloads = version_downloads  .filter(date.gt(now - 90.days()))  .filter(version_id.eq(any(versions)))  .order(date)  .load::<Download>(&conn)?;BewertungMan findet wohl Diesel in fast jedem Softwareprojekt, dass Persistierung in den drei meistgenutzten RDBMS Systemen durchführt. Damit gibt es eine Menge Beispielcode, eine sehr stabile Codebasis und das statische OR Mapping ist zur Laufzeit unschlagbar schnell. Das erkauft man sich mit einigen fehlenden Features (wie beispielsweise Async) und ggf. eine lange Compiler-Zeit.Diesel eignet sich besonders für überschaubare Datenmodelle, die primär mit CRUD Aktionen auskommen und es einfache, normalisierte Relationen gibt. FähigkeitenTreiberPostgreSQLMySQLSQLiteAsyncNein (Experimentell via https://github.com/weiznich/diesel_async - mit tokio postgres)Transport Layer Security (TLS)NeinRessourcenHomepage: https://diesel.rs/Repository: https://github.com/diesel-rs/dieselDokumentation: https://diesel.rs/guides/getting-startedRust-Doc: https://docs.diesel.rs/1.4.x/diesel/index.htmlSeaORMSeaORM ist jünger als Diesel und basiert auf SeaQuery und SQLx. Damit ist SeaORM ein dynamisches ORM System, dass zur Laufzeit Objekt-Relationen und das Mapping generiert. Wenn man mehr Flexibilität benötigt, kann man SeaQuery benutzen, welches eine SQL Abstraktion bietet, die nicht an ein OR Mapping typisiert ist.SeaORM nutzt Enums, um Spalten zu modellieren. SeaORM und SeaQuery können gemeinsam genutzt werden. BewertungMan kann SeaORM nicht wirklich mit Diesel vergleichen, da sie unterschiedliche Ansätze verfolgen. Wenn aber einen schnellen Compilerlauf für sehr große Datenmodelle benötigt und man zudem (eben aufgrund des großen Datenmodells) eine hohe Flexibilität an Abfragemöglichkeiten benötigt, wenn man nicht mit einem statischen Datenmodell arbeiten kann, dann ist SeaORM unschlagbar. Das erkauft man sich mit potenziellen Laufzeitfehlern, die man gut mit Tests abdecken sollte. Auch da bietet SeaORM eine gute Unterstützung. Überdies bietet SeaORM von Haus aus eine hervorragende Dokumentation.SeaORM ist sinnvoll für große Datenbank-Schemata, mit sehr vielen Tabellen und Attributen, die mit komplexen Abfragen verknüpft werden müssen. Ist das ORM noch zu statisch, kann mit SeaQuery jedes erdenkliche SQL Statement gebaut werden. SeaORM ist alternativlos, wenn man mit der gleichen Applikation auf unterschiedlichen Schemata arbeiten will.FähigkeitenTreiberSQlite (via sqlx-sqlite)PostgreSQL (via sqlx-postgres, Rust safe)MySQL (via sqlx-mysql, Rust safe)MS SQL - Unbekannt, SQLx unterstützt es, in der SeaORM Doku wird es nicht erwähntAsyncJa (actix, async-std und tokio)Transport Layer Security (TLS)Für Postgres und MySQL (über SQLx)RessourcenHomepage: https://www.sea-ql.org/SeaORM/Repository: https://github.com/SeaQL/sea-ormDokumentation: https://www.sea-ql.org/SeaORM/docs/index/rustormDas Framework hat sich auf das Data Access Object Mapping von SQL Ergebnissen spezialisiert und unterstützt damit die Übertragung der SQL Resultsets in Structs. Binding von Abfrage-Parameter besteht wohl, aber es gibt keine Beispiele.BewertungDie SQL Abfragen sind sehr Low-Level. Ein Guide oder umfangreiche Dokumentation gibt es nicht, aber die Möglichkeiten sind sehr fokussiert, sodass man sich schnell einarbeiten kann. Transaktionen werden wohl nicht unterstützt. Für größere Projekte ist rustorm eher nicht zu empfehlen. FähigkeitenTreiberSQlitePostgreSQLMySQLRessourcenHomepage: -Repository: https://github.com/ivanceras/rustormRust-Doc: https://docs.rs/rustorm/0.20.0/rustorm/
       
 (DIR) Post #ASPC45srJJA6PBMQ52 by nogoommethalya@write.tchncs.de
       2023-02-06T14:23:21.267184Z
       
       0 likes, 0 repeats
       
       إجراءات تنظيف مكيف الهواء الوحدة الداخليةأولاً ، تأكد دائمًا من فصل الطاقة تمامًاثم قم بإزالة الجزء الأمامي من مكيف الهواء برفق لتجنب إتلاف الحاجز الداخليثالثًا ، قم بتنظيف الزعانف الموجودة أسفل الغطاء الخارجي لمكيف الهواءرابعًا ، قم بإزالة فلتر شفط الهواء واغسله برفق وبشكل كامل بالماء والصابون ، هذا الفلتر جزء مهم من عملية التنظيف ، لذا نظفه جيدًا للتأكد من أن مكيف الهواء يعمل بكفاءة ، اتركه يجف جيدًا قبل إعادته مرة أخرى في مكيف الهواءخامساً: افحص الخرطوم الذي يخرج بالمال ، ونظفه جيداً ، وأزل كل ما يمنع خروج الماء.شركة تنظيف مكيفات بالدمام