pub struct PostgresConnection {
pub connection: Option<Client>,
/* private fields */
}
Fields§
§connection: Option<Client>
Implementations§
Source§impl PostgresConnection
impl PostgresConnection
pub fn connection_creator<'a>( config: PostgresConnectionConfig, ) -> impl FnMut(&Backend) -> PostgresConnection + 'a
Methods from Deref<Target = Client>§
Sourcepub fn execute<T>(
&mut self,
query: &T,
params: &[&(dyn ToSql + Sync)],
) -> Result<u64, Error>where
T: ToStatement + ?Sized,
pub fn execute<T>(
&mut self,
query: &T,
params: &[&(dyn ToSql + Sync)],
) -> Result<u64, Error>where
T: ToStatement + ?Sized,
Executes a statement, returning the number of rows modified.
A statement may contain parameters, specified by $n
, where n
is the index of the parameter of the list
provided, 1-indexed.
If the statement does not modify any rows (e.g. SELECT
), 0 is returned.
The query
argument can either be a Statement
, or a raw query string. If the same statement will be
repeatedly executed (perhaps with different query parameters), consider preparing the statement up front
with the prepare
method.
§Panics
Panics if the number of parameters provided does not match the number expected.
§Example
use postgres::{Client, NoTls};
let mut client = Client::connect("host=localhost user=postgres", NoTls)?;
let bar = 1i32;
let baz = true;
let rows_updated = client.execute(
"UPDATE foo SET bar = $1 WHERE baz = $2",
&[&bar, &baz],
)?;
println!("{} rows updated", rows_updated);
Sourcepub fn query<T>(
&mut self,
query: &T,
params: &[&(dyn ToSql + Sync)],
) -> Result<Vec<Row>, Error>where
T: ToStatement + ?Sized,
pub fn query<T>(
&mut self,
query: &T,
params: &[&(dyn ToSql + Sync)],
) -> Result<Vec<Row>, Error>where
T: ToStatement + ?Sized,
Executes a statement, returning the resulting rows.
A statement may contain parameters, specified by $n
, where n
is the index of the parameter of the list
provided, 1-indexed.
The query
argument can either be a Statement
, or a raw query string. If the same statement will be
repeatedly executed (perhaps with different query parameters), consider preparing the statement up front
with the prepare
method.
§Panics
Panics if the number of parameters provided does not match the number expected.
§Examples
use postgres::{Client, NoTls};
let mut client = Client::connect("host=localhost user=postgres", NoTls)?;
let baz = true;
for row in client.query("SELECT foo FROM bar WHERE baz = $1", &[&baz])? {
let foo: i32 = row.get("foo");
println!("foo: {}", foo);
}
Sourcepub fn query_one<T>(
&mut self,
query: &T,
params: &[&(dyn ToSql + Sync)],
) -> Result<Row, Error>where
T: ToStatement + ?Sized,
pub fn query_one<T>(
&mut self,
query: &T,
params: &[&(dyn ToSql + Sync)],
) -> Result<Row, Error>where
T: ToStatement + ?Sized,
Executes a statement which returns a single row, returning it.
Returns an error if the query does not return exactly one row.
A statement may contain parameters, specified by $n
, where n
is the index of the parameter of the list
provided, 1-indexed.
The query
argument can either be a Statement
, or a raw query string. If the same statement will be
repeatedly executed (perhaps with different query parameters), consider preparing the statement up front
with the prepare
method.
§Panics
Panics if the number of parameters provided does not match the number expected.
§Examples
use postgres::{Client, NoTls};
let mut client = Client::connect("host=localhost user=postgres", NoTls)?;
let baz = true;
let row = client.query_one("SELECT foo FROM bar WHERE baz = $1", &[&baz])?;
let foo: i32 = row.get("foo");
println!("foo: {}", foo);
Sourcepub fn query_opt<T>(
&mut self,
query: &T,
params: &[&(dyn ToSql + Sync)],
) -> Result<Option<Row>, Error>where
T: ToStatement + ?Sized,
pub fn query_opt<T>(
&mut self,
query: &T,
params: &[&(dyn ToSql + Sync)],
) -> Result<Option<Row>, Error>where
T: ToStatement + ?Sized,
Executes a statement which returns zero or one rows, returning it.
Returns an error if the query returns more than one row.
A statement may contain parameters, specified by $n
, where n
is the index of the parameter of the list
provided, 1-indexed.
The query
argument can either be a Statement
, or a raw query string. If the same statement will be
repeatedly executed (perhaps with different query parameters), consider preparing the statement up front
with the prepare
method.
§Panics
Panics if the number of parameters provided does not match the number expected.
§Examples
use postgres::{Client, NoTls};
let mut client = Client::connect("host=localhost user=postgres", NoTls)?;
let baz = true;
let row = client.query_opt("SELECT foo FROM bar WHERE baz = $1", &[&baz])?;
match row {
Some(row) => {
let foo: i32 = row.get("foo");
println!("foo: {}", foo);
}
None => println!("no matching foo"),
}
Sourcepub fn query_raw<'a, T, I>(
&mut self,
query: &T,
params: I,
) -> Result<RowIter<'_>, Error>where
T: ToStatement + ?Sized,
I: IntoIterator<Item = &'a dyn ToSql>,
<I as IntoIterator>::IntoIter: ExactSizeIterator,
pub fn query_raw<'a, T, I>(
&mut self,
query: &T,
params: I,
) -> Result<RowIter<'_>, Error>where
T: ToStatement + ?Sized,
I: IntoIterator<Item = &'a dyn ToSql>,
<I as IntoIterator>::IntoIter: ExactSizeIterator,
A maximally-flexible version of query
.
It takes an iterator of parameters rather than a slice, and returns an iterator of rows rather than collecting them into an array.
§Panics
Panics if the number of parameters provided does not match the number expected.
§Examples
use postgres::{Client, NoTls};
use fallible_iterator::FallibleIterator;
use std::iter;
let mut client = Client::connect("host=localhost user=postgres", NoTls)?;
let baz = true;
let mut it = client.query_raw("SELECT foo FROM bar WHERE baz = $1", iter::once(&baz as _))?;
while let Some(row) = it.next()? {
let foo: i32 = row.get("foo");
println!("foo: {}", foo);
}
If you have a type like Vec<T>
where T: ToSql
Rust will not know how to use it as params. To get around
this the type must explicitly be converted to &dyn ToSql
.
use postgres::types::ToSql;
use fallible_iterator::FallibleIterator;
let params: Vec<String> = vec![
"first param".into(),
"second param".into(),
];
let mut it = client.query_raw(
"SELECT foo FROM bar WHERE biz = $1 AND baz = $2",
params.iter().map(|p| p as &dyn ToSql),
)?;
while let Some(row) = it.next()? {
let foo: i32 = row.get("foo");
println!("foo: {}", foo);
}
Sourcepub fn prepare(&mut self, query: &str) -> Result<Statement, Error>
pub fn prepare(&mut self, query: &str) -> Result<Statement, Error>
Creates a new prepared statement.
Prepared statements can be executed repeatedly, and may contain query parameters (indicated by $1
, $2
, etc),
which are set when executed. Prepared statements can only be used with the connection that created them.
§Examples
use postgres::{Client, NoTls};
let mut client = Client::connect("host=localhost user=postgres", NoTls)?;
let statement = client.prepare("SELECT name FROM people WHERE id = $1")?;
for id in 0..10 {
let rows = client.query(&statement, &[&id])?;
let name: &str = rows[0].get(0);
println!("name: {}", name);
}
Sourcepub fn prepare_typed(
&mut self,
query: &str,
types: &[Type],
) -> Result<Statement, Error>
pub fn prepare_typed( &mut self, query: &str, types: &[Type], ) -> Result<Statement, Error>
Like prepare
, but allows the types of query parameters to be explicitly specified.
The list of types may be smaller than the number of parameters - the types of the remaining parameters will be
inferred. For example, client.prepare_typed(query, &[])
is equivalent to client.prepare(query)
.
§Examples
use postgres::{Client, NoTls};
use postgres::types::Type;
let mut client = Client::connect("host=localhost user=postgres", NoTls)?;
let statement = client.prepare_typed(
"SELECT name FROM people WHERE id = $1",
&[Type::INT8],
)?;
for id in 0..10 {
let rows = client.query(&statement, &[&id])?;
let name: &str = rows[0].get(0);
println!("name: {}", name);
}
Sourcepub fn copy_in<T>(&mut self, query: &T) -> Result<CopyInWriter<'_>, Error>where
T: ToStatement + ?Sized,
pub fn copy_in<T>(&mut self, query: &T) -> Result<CopyInWriter<'_>, Error>where
T: ToStatement + ?Sized,
Executes a COPY FROM STDIN
statement, returning the number of rows created.
The query
argument can either be a Statement
, or a raw query string. The data in the provided reader is
passed along to the server verbatim; it is the caller’s responsibility to ensure it uses the proper format.
PostgreSQL does not support parameters in COPY
statements, so this method does not take any.
The copy must be explicitly completed via the finish
method. If it is not, the copy will be aborted.
§Examples
use postgres::{Client, NoTls};
use std::io::Write;
let mut client = Client::connect("host=localhost user=postgres", NoTls)?;
let mut writer = client.copy_in("COPY people FROM stdin")?;
writer.write_all(b"1\tjohn\n2\tjane\n")?;
writer.finish()?;
Sourcepub fn copy_out<T>(&mut self, query: &T) -> Result<CopyOutReader<'_>, Error>where
T: ToStatement + ?Sized,
pub fn copy_out<T>(&mut self, query: &T) -> Result<CopyOutReader<'_>, Error>where
T: ToStatement + ?Sized,
Executes a COPY TO STDOUT
statement, returning a reader of the resulting data.
The query
argument can either be a Statement
, or a raw query string. PostgreSQL does not support parameters
in COPY
statements, so this method does not take any.
§Examples
use postgres::{Client, NoTls};
use std::io::Read;
let mut client = Client::connect("host=localhost user=postgres", NoTls)?;
let mut reader = client.copy_out("COPY people TO stdout")?;
let mut buf = vec![];
reader.read_to_end(&mut buf)?;
Sourcepub fn simple_query(
&mut self,
query: &str,
) -> Result<Vec<SimpleQueryMessage>, Error>
pub fn simple_query( &mut self, query: &str, ) -> Result<Vec<SimpleQueryMessage>, Error>
Executes a sequence of SQL statements using the simple query protocol.
Statements should be separated by semicolons. If an error occurs, execution of the sequence will stop at that
point. The simple query protocol returns the values in rows as strings rather than in their binary encodings,
so the associated row type doesn’t work with the FromSql
trait. Rather than simply returning the rows, this
method returns a sequence of an enum which indicates either the completion of one of the commands, or a row of
data. This preserves the framing between the separate statements in the request.
This is a simple convenience method over simple_query_iter
.
§Warning
Prepared statements should be use for any query which contains user-specified data, as they provided the functionality to safely imbed that data in the request. Do not form statements via string concatenation and pass them to this method!
Sourcepub fn batch_execute(&mut self, query: &str) -> Result<(), Error>
pub fn batch_execute(&mut self, query: &str) -> Result<(), Error>
Executes a sequence of SQL statements using the simple query protocol.
Statements should be separated by semicolons. If an error occurs, execution of the sequence will stop at that point. This is intended for use when, for example, initializing a database schema.
§Warning
Prepared statements should be use for any query which contains user-specified data, as they provided the functionality to safely embed that data in the request. Do not form statements via string concatenation and pass them to this method!
Sourcepub fn transaction(&mut self) -> Result<Transaction<'_>, Error>
pub fn transaction(&mut self) -> Result<Transaction<'_>, Error>
Begins a new database transaction.
The transaction will roll back by default - use the commit
method to commit it.
§Examples
use postgres::{Client, NoTls};
let mut client = Client::connect("host=localhost user=postgres", NoTls)?;
let mut transaction = client.transaction()?;
transaction.execute("UPDATE foo SET bar = 10", &[])?;
// ...
transaction.commit()?;
Sourcepub fn build_transaction(&mut self) -> TransactionBuilder<'_>
pub fn build_transaction(&mut self) -> TransactionBuilder<'_>
Returns a builder for a transaction with custom settings.
Unlike the transaction
method, the builder can be used to control the transaction’s isolation level and other
attributes.
§Examples
use postgres::{Client, IsolationLevel, NoTls};
let mut client = Client::connect("host=localhost user=postgres", NoTls)?;
let mut transaction = client.build_transaction()
.isolation_level(IsolationLevel::RepeatableRead)
.start()?;
transaction.execute("UPDATE foo SET bar = 10", &[])?;
// ...
transaction.commit()?;
Sourcepub fn notifications(&mut self) -> Notifications<'_>
pub fn notifications(&mut self) -> Notifications<'_>
Returns a structure providing access to asynchronous notifications.
Use the LISTEN
command to register this connection for notifications.
Sourcepub fn cancel_token(&self) -> CancelToken
pub fn cancel_token(&self) -> CancelToken
Constructs a cancellation token that can later be used to request cancellation of a query running on this connection.
§Examples
use postgres::{Client, NoTls};
use postgres::error::SqlState;
use std::thread;
use std::time::Duration;
let mut client = Client::connect("host=localhost user=postgres", NoTls)?;
let cancel_token = client.cancel_token();
thread::spawn(move || {
// Abort the query after 5s.
thread::sleep(Duration::from_secs(5));
let _ = cancel_token.cancel_query(NoTls);
});
match client.simple_query("SELECT long_running_query()") {
Err(e) if e.code() == Some(&SqlState::QUERY_CANCELED) => {
// Handle canceled query.
}
Err(err) => return Err(err.into()),
Ok(rows) => {
// ...
}
}
// ...
Trait Implementations§
Source§impl Connection for PostgresConnection
impl Connection for PostgresConnection
Source§type Error = Error
type Error = Error
connect
or close
functions. This
is an associated type for the trait meaning each specific implementation
of the Connection
trait may choose the appropriate concrete error type
to return. The only constraint applied is that the selected error type
must implement the
Error trait from
the standard library. This allows for the error to relevant to the
context of the Connection
implementation while avoiding unnecessary
type parameters or having to coerce data between incompatible error
types.Source§fn connect(&mut self) -> Result<(), Self::Error>
fn connect(&mut self) -> Result<(), Self::Error>
Connection
trait
implementors are provided with details about the backend when the
create_connection
function is invoked by the connection pool upon
notification by the Resolver
that a new backend is available. The
create_connection
function is provided to the connection pool via the
input parameters to ConnectionPool::new
. Returns an error
if the connection attempt fails.