pub struct SurrealConnection<C: Connection + Debug> { /* private fields */ }
Implementations§
Source§impl<C: Connection + Debug> SurrealConnection<C>
impl<C: Connection + Debug> SurrealConnection<C>
Methods from Deref<Target = Surreal<C>>§
Sourcepub fn set(
&self,
key: impl Into<String>,
value: impl Serialize + 'static,
) -> Set<'_, C>
pub fn set( &self, key: impl Into<String>, value: impl Serialize + 'static, ) -> Set<'_, C>
Assigns a value as a parameter for this connection
§Examples
use serde::Serialize;
#[derive(Serialize)]
struct Name {
first: String,
last: String,
}
// Assign the variable on the connection
db.set("name", Name {
first: "Tobie".into(),
last: "Morgan Hitchcock".into(),
}).await?;
// Use the variable in a subsequent query
db.query("CREATE person SET name = $name").await?;
// Use the variable in a subsequent query
db.query("SELECT * FROM person WHERE name.first = $name.first").await?;
Sourcepub fn unset(&self, key: impl Into<String>) -> Unset<'_, C>
pub fn unset(&self, key: impl Into<String>) -> Unset<'_, C>
Removes a parameter from this connection
§Examples
use serde::Serialize;
#[derive(Serialize)]
struct Name {
first: String,
last: String,
}
// Assign the variable on the connection
db.set("name", Name {
first: "Tobie".into(),
last: "Morgan Hitchcock".into(),
}).await?;
// Use the variable in a subsequent query
db.query("CREATE person SET name = $name").await?;
// Remove the variable from the connection
db.unset("name").await?;
Sourcepub fn signup<R>(
&self,
credentials: impl Credentials<Signup, R>,
) -> Signup<'_, C, R>
pub fn signup<R>( &self, credentials: impl Credentials<Signup, R>, ) -> Signup<'_, C, R>
Signs up a user with a specific record access method
§Examples
use serde::Serialize;
use surrealdb::opt::auth::Root;
use surrealdb::opt::auth::Record;
#[derive(Debug, Serialize)]
struct AuthParams {
email: String,
password: String,
}
// Sign in as root
db.signin(Root {
username: "root",
password: "root",
})
.await?;
// Select the namespace/database to use
db.use_ns("namespace").use_db("database").await?;
// Define the user record access
let surql = r#"
DEFINE ACCESS user_access ON DATABASE TYPE RECORD DURATION 24h
SIGNUP ( CREATE user SET email = $email, password = crypto::argon2::generate($password) )
SIGNIN ( SELECT * FROM user WHERE email = $email AND crypto::argon2::compare(password, $password) )
"#;
db.query(surql).await?.check()?;
// Sign a user up
db.signup(Record {
namespace: "namespace",
database: "database",
access: "user_access",
params: AuthParams {
email: "john.doe@example.com".into(),
password: "password123".into(),
},
}).await?;
Sourcepub fn signin<R>(
&self,
credentials: impl Credentials<Signin, R>,
) -> Signin<'_, C, R>
pub fn signin<R>( &self, credentials: impl Credentials<Signin, R>, ) -> Signin<'_, C, R>
Signs this connection in to a specific authentication level
§Examples
Namespace signin
use surrealdb::opt::auth::Root;
use surrealdb::opt::auth::Namespace;
// Sign in as root
db.signin(Root {
username: "root",
password: "root",
})
.await?;
// Select the namespace/database to use
db.use_ns("namespace").use_db("database").await?;
// Define the user
let surql = "DEFINE USER johndoe ON NAMESPACE PASSWORD 'password123'";
db.query(surql).await?.check()?;
// Sign a user in
db.signin(Namespace {
namespace: "namespace",
username: "johndoe",
password: "password123",
}).await?;
Database signin
use surrealdb::opt::auth::Root;
use surrealdb::opt::auth::Database;
// Sign in as root
db.signin(Root {
username: "root",
password: "root",
})
.await?;
// Select the namespace/database to use
db.use_ns("namespace").use_db("database").await?;
// Define the user
let surql = "DEFINE USER johndoe ON DATABASE PASSWORD 'password123'";
db.query(surql).await?.check()?;
// Sign a user in
db.signin(Database {
namespace: "namespace",
database: "database",
username: "johndoe",
password: "password123",
}).await?;
Record signin
use serde::Serialize;
use surrealdb::opt::auth::Root;
use surrealdb::opt::auth::Record;
#[derive(Debug, Serialize)]
struct AuthParams {
email: String,
password: String,
}
// Select the namespace/database to use
db.use_ns("namespace").use_db("database").await?;
// Sign a user in
db.signin(Record {
namespace: "namespace",
database: "database",
access: "user_access",
params: AuthParams {
email: "john.doe@example.com".into(),
password: "password123".into(),
},
}).await?;
Sourcepub fn invalidate(&self) -> Invalidate<'_, C>
pub fn invalidate(&self) -> Invalidate<'_, C>
Sourcepub fn authenticate(&self, token: impl Into<Jwt>) -> Authenticate<'_, C>
pub fn authenticate(&self, token: impl Into<Jwt>) -> Authenticate<'_, C>
Sourcepub fn query(&self, query: impl IntoQuery) -> Query<'_, C>
pub fn query(&self, query: impl IntoQuery) -> Query<'_, C>
Runs a set of SurrealQL statements against the database
§Examples
// Select the namespace/database to use
db.use_ns("namespace").use_db("database").await?;
// Run queries
let mut result = db
.query("CREATE person")
.query("SELECT * FROM type::table($table)")
.bind(("table", "person"))
.await?;
// Get the first result from the first query
let created: Option<Person> = result.take(0)?;
// Get all of the results from the second query
let people: Vec<Person> = result.take(1)?;
#[derive(serde::Deserialize)]
struct Country {
name: String
}
// The .take() method can be used for error handling
// If the table has no defined schema, this query will
// create a `country` on the SurrealDB side, but...
let mut result = db
.query("CREATE country")
.await?;
// It won't deserialize into a Country struct
if let Err(e) = result.take::<Option<Country>>(0) {
println!("Failed to make a country: {e:#?}");
assert!(e.to_string().contains("missing field `name`"));
}
Sourcepub fn select<O>(&self, resource: impl IntoResource<O>) -> Select<'_, C, O>
pub fn select<O>(&self, resource: impl IntoResource<O>) -> Select<'_, C, O>
Selects all records in a table, or a specific record
§Examples
// Select the namespace/database to use
db.use_ns("namespace").use_db("database").await?;
// Select all records from a table
let people: Vec<Person> = db.select("person").await?;
// Select a range of records from a table
let people: Vec<Person> = db.select("person").range("jane".."john").await?;
// Select a specific record from a table
let person: Option<Person> = db.select(("person", "h5wxrf2ewk8xjxosxtyc")).await?;
// To listen for updates as they happen on a record, a range of records
// or entire table use a live query. This is done by simply calling `.live()`
// after this method. That gives you a stream of notifications you can listen on.
let mut stream = db.select(resource).live().await?;
while let Some(notification) = stream.next().await {
// Use the notification
}
Sourcepub fn create<R>(&self, resource: impl CreateResource<R>) -> Create<'_, C, R>
pub fn create<R>(&self, resource: impl CreateResource<R>) -> Create<'_, C, R>
Creates a record in the database
§Examples
use serde::Serialize;
#[derive(Serialize)]
struct Settings {
active: bool,
marketing: bool,
}
#[derive(Serialize)]
struct User {
name: &'static str,
settings: Settings,
}
// Select the namespace/database to use
db.use_ns("namespace").use_db("database").await?;
// Create a record with a random ID
let person: Option<Person> = db.create("person").await?;
// Create a record with a specific ID
let record: Option<Person> = db.create(("person", "tobie"))
.content(User {
name: "Tobie",
settings: Settings {
active: true,
marketing: true,
},
})
.await?;
Sourcepub fn insert<O>(&self, resource: impl IntoResource<O>) -> Insert<'_, C, O>
pub fn insert<O>(&self, resource: impl IntoResource<O>) -> Insert<'_, C, O>
Insert a record or records into a table
§Examples
use serde::{Serialize, Deserialize};
use surrealdb::RecordId;
#[derive(Serialize)]
struct Settings {
active: bool,
marketing: bool,
}
#[derive(Serialize)]
struct User<'a> {
name: &'a str,
settings: Settings,
}
// Select the namespace/database to use
db.use_ns("namespace").use_db("database").await?;
// Insert a record with a specific ID
let person: Option<Person> = db.insert(("person", "tobie"))
.content(User {
name: "Tobie",
settings: Settings {
active: true,
marketing: true,
},
})
.await?;
// Insert multiple records into the table
let people: Vec<Person> = db.insert("person")
.content(vec![
User {
name: "Tobie",
settings: Settings {
active: true,
marketing: false,
},
},
User {
name: "Jaime",
settings: Settings {
active: true,
marketing: true,
},
},
])
.await?;
// Insert multiple records with pre-defined IDs
#[derive(Serialize)]
struct UserWithId<'a> {
id: RecordId,
name: &'a str,
settings: Settings,
}
let people: Vec<Person> = db.insert("person")
.content(vec![
UserWithId {
id: ("person", "tobie").into(),
name: "Tobie",
settings: Settings {
active: true,
marketing: false,
},
},
UserWithId {
id: ("person", "jaime").into(),
name: "Jaime",
settings: Settings {
active: true,
marketing: true,
},
},
])
.await?;
// Insert multiple records into different tables
#[derive(Serialize)]
struct WithId<'a> {
id: RecordId,
name: &'a str,
}
let people: Vec<Person> = db.insert(())
.content(vec![
WithId {
id: ("person", "tobie").into(),
name: "Tobie",
},
WithId {
id: ("company", "surrealdb").into(),
name: "SurrealDB",
},
])
.await?;
// Insert relations
#[derive(Serialize, Deserialize)]
struct Founded {
#[serde(rename = "in")]
founder: RecordId,
#[serde(rename = "out")]
company: RecordId,
}
let founded: Vec<Founded> = db.insert("founded")
.relation(vec![
Founded {
founder: ("person", "tobie").into(),
company: ("company", "surrealdb").into(),
},
Founded {
founder: ("person", "jaime").into(),
company: ("company", "surrealdb").into(),
},
])
.await?;
Sourcepub fn upsert<O>(&self, resource: impl IntoResource<O>) -> Upsert<'_, C, O>
pub fn upsert<O>(&self, resource: impl IntoResource<O>) -> Upsert<'_, C, O>
Updates all records in a table, or a specific record
§Examples
Replace the current document / record data with the specified data.
use serde::Serialize;
#[derive(Serialize)]
struct Settings {
active: bool,
marketing: bool,
}
#[derive(Serialize)]
struct User {
name: &'static str,
settings: Settings,
}
// Select the namespace/database to use
db.use_ns("namespace").use_db("database").await?;
// Update all records in a table
let people: Vec<Person> = db.upsert("person").await?;
// Update a record with a specific ID
let person: Option<Person> = db.upsert(("person", "tobie"))
.content(User {
name: "Tobie",
settings: Settings {
active: true,
marketing: true,
},
})
.await?;
Merge the current document / record data with the specified data.
use serde::Serialize;
use time::OffsetDateTime;
#[derive(Serialize)]
struct UpdatedAt {
updated_at: OffsetDateTime,
}
#[derive(Serialize)]
struct Settings {
active: bool,
}
#[derive(Serialize)]
struct User {
updated_at: OffsetDateTime,
settings: Settings,
}
// Select the namespace/database to use
db.use_ns("namespace").use_db("database").await?;
// Update all records in a table
let people: Vec<Person> = db.upsert("person")
.merge(UpdatedAt {
updated_at: OffsetDateTime::now_utc(),
})
.await?;
// Update a record with a specific ID
let person: Option<Person> = db.upsert(("person", "tobie"))
.merge(User {
updated_at: OffsetDateTime::now_utc(),
settings: Settings {
active: true,
},
})
.await?;
Apply JSON Patch changes to all records, or a specific record, in the database.
use serde::Serialize;
use surrealdb::opt::PatchOp;
use time::OffsetDateTime;
#[derive(Serialize)]
struct UpdatedAt {
updated_at: OffsetDateTime,
}
#[derive(Serialize)]
struct Settings {
active: bool,
}
#[derive(Serialize)]
struct User {
updated_at: OffsetDateTime,
settings: Settings,
}
// Select the namespace/database to use
db.use_ns("namespace").use_db("database").await?;
// Update all records in a table
let people: Vec<Person> = db.upsert("person")
.patch(PatchOp::replace("/created_at", OffsetDateTime::now_utc()))
.await?;
// Update a record with a specific ID
let person: Option<Person> = db.upsert(("person", "tobie"))
.patch(PatchOp::replace("/settings/active", false))
.patch(PatchOp::add("/tags", ["developer", "engineer"]))
.patch(PatchOp::remove("/temp"))
.await?;
Sourcepub fn update<O>(&self, resource: impl IntoResource<O>) -> Update<'_, C, O>
pub fn update<O>(&self, resource: impl IntoResource<O>) -> Update<'_, C, O>
Updates all records in a table, or a specific record
§Examples
Replace the current document / record data with the specified data.
use serde::Serialize;
#[derive(Serialize)]
struct Settings {
active: bool,
marketing: bool,
}
#[derive(Serialize)]
struct User {
name: &'static str,
settings: Settings,
}
// Select the namespace/database to use
db.use_ns("namespace").use_db("database").await?;
// Update all records in a table
let people: Vec<Person> = db.update("person").await?;
// Update a record with a specific ID
let person: Option<Person> = db.update(("person", "tobie"))
.content(User {
name: "Tobie",
settings: Settings {
active: true,
marketing: true,
},
})
.await?;
Merge the current document / record data with the specified data.
use serde::Serialize;
use time::OffsetDateTime;
#[derive(Serialize)]
struct UpdatedAt {
updated_at: OffsetDateTime,
}
#[derive(Serialize)]
struct Settings {
active: bool,
}
#[derive(Serialize)]
struct User {
updated_at: OffsetDateTime,
settings: Settings,
}
// Select the namespace/database to use
db.use_ns("namespace").use_db("database").await?;
// Update all records in a table
let people: Vec<Person> = db.update("person")
.merge(UpdatedAt {
updated_at: OffsetDateTime::now_utc(),
})
.await?;
// Update a record with a specific ID
let person: Option<Person> = db.update(("person", "tobie"))
.merge(User {
updated_at: OffsetDateTime::now_utc(),
settings: Settings {
active: true,
},
})
.await?;
Apply JSON Patch changes to all records, or a specific record, in the database.
use serde::Serialize;
use surrealdb::opt::PatchOp;
use time::OffsetDateTime;
#[derive(Serialize)]
struct UpdatedAt {
updated_at: OffsetDateTime,
}
#[derive(Serialize)]
struct Settings {
active: bool,
}
#[derive(Serialize)]
struct User {
updated_at: OffsetDateTime,
settings: Settings,
}
// Select the namespace/database to use
db.use_ns("namespace").use_db("database").await?;
// Update all records in a table
let people: Vec<Person> = db.update("person")
.patch(PatchOp::replace("/created_at", OffsetDateTime::now_utc()))
.await?;
// Update a record with a specific ID
let person: Option<Person> = db.update(("person", "tobie"))
.patch(PatchOp::replace("/settings/active", false))
.patch(PatchOp::add("/tags", ["developer", "engineer"]))
.patch(PatchOp::remove("/temp"))
.await?;
Sourcepub fn delete<O>(&self, resource: impl IntoResource<O>) -> Delete<'_, C, O>
pub fn delete<O>(&self, resource: impl IntoResource<O>) -> Delete<'_, C, O>
Deletes all records, or a specific record
§Examples
// Select the namespace/database to use
db.use_ns("namespace").use_db("database").await?;
// Delete all records from a table
let people: Vec<Person> = db.delete("person").await?;
// Delete a specific record from a table
let person: Option<Person> = db.delete(("person", "h5wxrf2ewk8xjxosxtyc")).await?;
Sourcepub fn run<R>(&self, function: impl IntoFn) -> Run<'_, C, R>
pub fn run<R>(&self, function: impl IntoFn) -> Run<'_, C, R>
Runs a function
§Examples
// Specify no args by not calling `.args()`
let foo = db.run("fn::foo").await?; // fn::foo()
// A single value will be turned into one argument
let bar = db.run("fn::bar").args(42).await?; // fn::bar(42)
// Arrays are treated as single arguments
let count = db.run("count").args(vec![1,2,3]).await?;
// Specify multiple args using a tuple
let two = db.run("math::log").args((100, 10)).await?; // math::log(100, 10)
Sourcepub async fn wait_for(&self, event: WaitFor)
pub async fn wait_for(&self, event: WaitFor)
Wait for the selected event to happen before proceeding
Sourcepub fn export<R>(
&self,
target: impl IntoExportDestination<R>,
) -> Export<'_, C, R>
pub fn export<R>( &self, target: impl IntoExportDestination<R>, ) -> Export<'_, C, R>
Dumps the database contents to a file
§Support
Currently only supported by HTTP and the local engines. Not supported on WebAssembly.
§Examples
// Select the namespace/database to use
db.use_ns("namespace").use_db("database").await?;
// Export to a file
db.export("backup.sql").await?;
// Export to a stream of bytes
let mut backup = db.export(()).await?;
while let Some(result) = backup.next().await {
match result {
Ok(bytes) => {
// Do something with the bytes received...
}
Err(error) => {
// Handle the export error
}
}
}
Trait Implementations§
Source§impl<C: Clone + Connection + Debug> Clone for SurrealConnection<C>
impl<C: Clone + Connection + Debug> Clone for SurrealConnection<C>
Source§fn clone(&self) -> SurrealConnection<C>
fn clone(&self) -> SurrealConnection<C>
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moreSource§impl<C: Connection + Debug> DatabaseConnection for SurrealConnection<C>
impl<C: Connection + Debug> DatabaseConnection for SurrealConnection<C>
type Error = Error
async fn authenticate( &self, jwt: &str, ) -> Result<(), AuthenticationError<Self::Error>>
async fn signin( &self, credentials: Credentials, ) -> Result<String, AuthenticationError<Self::Error>>
async fn me(&self) -> Result<User, Self::Error>
async fn draft<D: Document + Send>( &self, id: &str, data: Value, ) -> Result<Item<Value>, Self::Error>
async fn delete_draft<D: Document + Send + DeserializeOwned>( &self, id: &str, ) -> Result<Item<Value>, Self::Error>
async fn publish<D: Document + Send + Serialize + DeserializeOwned + 'static>( &self, id: &str, publish_at: Option<DateTime<Utc>>, data: Valid<D>, ) -> Result<Item<D>, Self::Error>
async fn put<D: Document + Serialize + DeserializeOwned + Send + Debug + 'static>( &self, item: Item<D>, ) -> Result<Item<D>, Self::Error>
async fn delete<D: Document + Send + Debug>( &self, id: &str, ) -> Result<Item<D>, Self::Error>
async fn get_all<D: Document + DeserializeOwned + Send>( &self, ) -> Result<Vec<Item<Value>>, Self::Error>
async fn get_by_id<D: Document + DeserializeOwned + Send>( &self, id: &str, ) -> Result<Option<Item<Value>>, Self::Error>
Source§impl<C: Debug + Connection + Debug> Debug for SurrealConnection<C>
impl<C: Debug + Connection + Debug> Debug for SurrealConnection<C>
Auto Trait Implementations§
impl<C> Freeze for SurrealConnection<C>
impl<C> RefUnwindSafe for SurrealConnection<C>where
C: RefUnwindSafe,
impl<C> Send for SurrealConnection<C>
impl<C> Sync for SurrealConnection<C>
impl<C> Unpin for SurrealConnection<C>where
C: Unpin,
impl<C> UnwindSafe for SurrealConnection<C>where
C: UnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read more