首页 > 代码库 > sqlite3在D语言下之代码流畅体验

sqlite3在D语言下之代码流畅体验

 1 // Open a database in memory. 2 Database db; 3 try 4 { 5     db = Database(":memory:"); 6 } 7 catch (SqliteException e) 8 { 9     // Error creating the database10     assert(false, "Error: " ~ e.msg);11 }12 13 // Create a table.14 try15 {16     db.execute(17         "CREATE TABLE person (18             id INTEGER PRIMARY KEY,19             last_name TEXT NOT NULL,20             first_name TEXT,21             score REAL,22             photo BLOB23          )"24     );25 }26 catch (SqliteException e)27 {28     // Error creating the table.29     assert(false, "Error: " ~ e.msg);30 }31 32 // Populate the table.33 try34 {35     auto query = db.query(36         "INSERT INTO person (last_name, first_name, score, photo)37          VALUES (:last_name, :first_name, :score, :photo)"38     );39     40     // Bind everything with chained calls to params.bind().41     query.params.bind(":last_name", "Smith")42                 .bind(":first_name", "John")43                 .bind(":score", 77.5);44     ubyte[] photo = cast(ubyte[]) "..."; // Store the photo as raw array of data.45     query.params.bind(":photo", photo);46     query.execute();47     48     query.reset(); // Need to reset the query after execution.49     query.params.bind(":last_name", "Doe")50                 .bind(":first_name", "John")51                 .bind(3, null) // Use of index instead of name.52                 .bind(":photo", null);53     query.execute();54 }55 catch (SqliteException e)56 {57     // Error executing the query.58     assert(false, "Error: " ~ e.msg);59 }60 assert(db.totalChanges == 2); // Two ‘persons‘ were inserted.61 62 // Reading the table63 try64 {65     // Count the Johns in the table.66     auto query = db.query("SELECT count(*) FROM person WHERE first_name == ‘John‘");67     assert(query.rows.front[0].get!int() == 2);68     69     // Fetch the data from the table.70     query = db.query("SELECT * FROM person");71     foreach (row; query.rows)72     {73         // "id" should be the column at index 0:74         auto id = row[0].get!int();75         // Some conversions are possible with the method as():76         auto name = format("%s, %s", row["last_name"].get!string(), row["first_name"].get!(char[])());77         // The score can be NULL, so provide 0 (instead of NAN) as a default value to replace NULLs:78         auto score = row["score"].get!real(0.0);79         // Use of opDispatch with column name:80         auto photo = row.photo.get!(ubyte[])();81         82         // ... and use all these data!83     }84 }85 catch (SqliteException e)86 {87     // Error reading the database.88     assert(false, "Error: " ~ e.msg);89 }