Struct PgTypeInfo
pub struct PgTypeInfo(/* private fields */);Expand description
Type information for a PostgreSQL type.
§Note: Implementation of == (PartialEq::eq())
Because == on TypeInfos has been used throughout the SQLx API as a synonym for type compatibility,
e.g. in the default impl of Type::compatible(),
some concessions have been made in the implementation.
When comparing two PgTypeInfos using the == operator (PartialEq::eq()),
if one was constructed with Self::with_oid() and the other with Self::with_name() or
Self::array_of(), == will return true:
// Potentially surprising result, this assert will pass:
assert_eq!(PgTypeInfo::with_oid(Oid(1)), PgTypeInfo::with_name("definitely_not_real"));Since it is not possible in this case to prove the types are not compatible (because
both PgTypeInfos need to be resolved by an active connection to know for sure)
and type compatibility is mainly done as a sanity check anyway,
it was deemed acceptable to fudge equality in this very specific case.
This also applies when querying with the text protocol (not using prepared statements,
e.g. sqlx::raw_sql()), as the connection will be unable
to look up the type info like it normally does when preparing a statement: it won’t know
what the OIDs of the output columns will be until it’s in the middle of reading the result,
and by that time it’s too late.
To compare types for exact equality, use Self::type_eq() instead.
Implementations§
§impl PgTypeInfo
impl PgTypeInfo
pub fn kind(&self) -> &PgTypeKind
pub fn kind(&self) -> &PgTypeKind
Returns the kind (simple, array, enum, etc.) for this type.
pub fn oid(&self) -> Option<Oid>
pub fn oid(&self) -> Option<Oid>
Returns the OID for this type, if available.
The OID may not be available if SQLx only knows the type by name.
It will have to be resolved by a PgConnection at runtime which
will yield a new and semantically distinct TypeInfo instance.
This method does not perform any such lookup.
§Note
With the exception of the default pg_type catalog, type OIDs are not stable in PostgreSQL.
If a type is added by an extension, its OID will be assigned when the CREATE EXTENSION statement is executed,
and so can change depending on what extensions are installed and in what order, as well as the exact
version of PostgreSQL.
pub const fn with_name(name: &'static str) -> PgTypeInfo
pub const fn with_name(name: &'static str) -> PgTypeInfo
Create a PgTypeInfo from a type name.
The OID for the type will be fetched from Postgres on use of a value of this type. The fetched OID will be cached per-connection.
§Note: Type Names Prefixed with _
In pg_catalog.pg_type, Postgres prefixes a type name with _ to denote an array of that
type, e.g. int4[] actually exists in pg_type as _int4.
Previously, it was necessary in manual PgHasArrayType impls
to return PgTypeInfo::with_name() with the type name prefixed with _ to denote
an array type, but this would not work with schema-qualified names.
As of 0.8, PgTypeInfo::array_of() is used to declare an array type,
and the Postgres driver is now able to properly resolve arrays of custom types,
even in other schemas, which was not previously supported.
It is highly recommended to migrate existing usages to PgTypeInfo::array_of() where
applicable.
However, to maintain compatibility, the driver now infers any type name prefixed with _
to be an array of that type. This may introduce some breakages for types which use
a _ prefix but which are not arrays.
As a workaround, type names with _ as a prefix but which are not arrays should be wrapped
in quotes, e.g.:
use sqlx::postgres::PgTypeInfo;
use sqlx::{Type, TypeInfo};
/// `CREATE TYPE "_foo" AS ENUM ('Bar', 'Baz');`
#[derive(sqlx::Type)]
// Will prevent SQLx from inferring `_foo` as an array type.
#[sqlx(type_name = r#""_foo""#)]
enum Foo {
Bar,
Baz
}
assert_eq!(Foo::type_info().name(), r#""_foo""#);pub fn array_of(elem_name: &'static str) -> PgTypeInfo
pub fn array_of(elem_name: &'static str) -> PgTypeInfo
Create a PgTypeInfo of an array from the name of its element type.
The array type OID will be fetched from Postgres on use of a value of this type. The fetched OID will be cached per-connection.
pub const fn with_oid(oid: Oid) -> PgTypeInfo
pub const fn with_oid(oid: Oid) -> PgTypeInfo
Create a PgTypeInfo from an OID.
Note that the OID for a type is very dependent on the environment. If you only ever use
one database or if this is an unhandled built-in type, you should be fine. Otherwise,
you will be better served using Self::with_name().
§Note: Interaction with ==
This constructor may give surprising results with ==.
See the type-level docs for details.
pub fn type_eq(&self, other: &PgTypeInfo) -> bool
pub fn type_eq(&self, other: &PgTypeInfo) -> bool
Returns true if self can be compared exactly to other.
Unlike ==, this will return false if
Trait Implementations§
§impl Clone for PgTypeInfo
impl Clone for PgTypeInfo
§fn clone(&self) -> PgTypeInfo
fn clone(&self) -> PgTypeInfo
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read more§impl Debug for PgTypeInfo
impl Debug for PgTypeInfo
§impl Deref for PgTypeInfo
impl Deref for PgTypeInfo
§impl<'de> Deserialize<'de> for PgTypeInfo
impl<'de> Deserialize<'de> for PgTypeInfo
§fn deserialize<__D>(
__deserializer: __D,
) -> Result<PgTypeInfo, <__D as Deserializer<'de>>::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(
__deserializer: __D,
) -> Result<PgTypeInfo, <__D as Deserializer<'de>>::Error>where
__D: Deserializer<'de>,
§impl Display for PgTypeInfo
impl Display for PgTypeInfo
§impl PartialEq for PgTypeInfo
impl PartialEq for PgTypeInfo
§impl Serialize for PgTypeInfo
impl Serialize for PgTypeInfo
§fn serialize<__S>(
&self,
__serializer: __S,
) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>where
__S: Serializer,
fn serialize<__S>(
&self,
__serializer: __S,
) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>where
__S: Serializer,
§impl TypeInfo for PgTypeInfo
impl TypeInfo for PgTypeInfo
§fn name(&self) -> &str
fn name(&self) -> &str
VARCHAR, TEXT, or INT. Type names should be uppercase. They
should be a rough approximation of how they are written in SQL in the given database.fn is_null(&self) -> bool
§fn type_compatible(&self, other: &PgTypeInfo) -> boolwhere
PgTypeInfo: Sized,
fn type_compatible(&self, other: &PgTypeInfo) -> boolwhere
PgTypeInfo: Sized,
impl StructuralPartialEq for PgTypeInfo
Auto Trait Implementations§
impl Freeze for PgTypeInfo
impl RefUnwindSafe for PgTypeInfo
impl Send for PgTypeInfo
impl Sync for PgTypeInfo
impl Unpin for PgTypeInfo
impl UnsafeUnpin for PgTypeInfo
impl UnwindSafe for PgTypeInfo
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,
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§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§impl<'src, T> IntoMaybe<'src, T> for Twhere
T: 'src,
impl<'src, T> IntoMaybe<'src, T> for Twhere
T: 'src,
§impl<T> Paint for Twhere
T: ?Sized,
impl<T> Paint for Twhere
T: ?Sized,
§fn fg(&self, value: Color) -> Painted<&T>
fn fg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self with the foreground set to
value.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like red() and
green(), which have the same functionality but are
pithier.
§Example
Set foreground color to white using fg():
use yansi::{Paint, Color};
painted.fg(Color::White);Set foreground color to white using white().
use yansi::Paint;
painted.white();§fn bright_black(&self) -> Painted<&T>
fn bright_black(&self) -> Painted<&T>
§fn bright_red(&self) -> Painted<&T>
fn bright_red(&self) -> Painted<&T>
§fn bright_green(&self) -> Painted<&T>
fn bright_green(&self) -> Painted<&T>
§fn bright_yellow(&self) -> Painted<&T>
fn bright_yellow(&self) -> Painted<&T>
§fn bright_blue(&self) -> Painted<&T>
fn bright_blue(&self) -> Painted<&T>
§fn bright_magenta(&self) -> Painted<&T>
fn bright_magenta(&self) -> Painted<&T>
§fn bright_cyan(&self) -> Painted<&T>
fn bright_cyan(&self) -> Painted<&T>
§fn bright_white(&self) -> Painted<&T>
fn bright_white(&self) -> Painted<&T>
§fn bg(&self, value: Color) -> Painted<&T>
fn bg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self with the background set to
value.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like on_red() and
on_green(), which have the same functionality but
are pithier.
§Example
Set background color to red using fg():
use yansi::{Paint, Color};
painted.bg(Color::Red);Set background color to red using on_red().
use yansi::Paint;
painted.on_red();§fn on_primary(&self) -> Painted<&T>
fn on_primary(&self) -> Painted<&T>
§fn on_magenta(&self) -> Painted<&T>
fn on_magenta(&self) -> Painted<&T>
§fn on_bright_black(&self) -> Painted<&T>
fn on_bright_black(&self) -> Painted<&T>
§fn on_bright_red(&self) -> Painted<&T>
fn on_bright_red(&self) -> Painted<&T>
§fn on_bright_green(&self) -> Painted<&T>
fn on_bright_green(&self) -> Painted<&T>
§fn on_bright_yellow(&self) -> Painted<&T>
fn on_bright_yellow(&self) -> Painted<&T>
§fn on_bright_blue(&self) -> Painted<&T>
fn on_bright_blue(&self) -> Painted<&T>
§fn on_bright_magenta(&self) -> Painted<&T>
fn on_bright_magenta(&self) -> Painted<&T>
§fn on_bright_cyan(&self) -> Painted<&T>
fn on_bright_cyan(&self) -> Painted<&T>
§fn on_bright_white(&self) -> Painted<&T>
fn on_bright_white(&self) -> Painted<&T>
§fn attr(&self, value: Attribute) -> Painted<&T>
fn attr(&self, value: Attribute) -> Painted<&T>
Enables the styling [Attribute] value.
This method should be used rarely. Instead, prefer to use
attribute-specific builder methods like bold() and
underline(), which have the same functionality
but are pithier.
§Example
Make text bold using attr():
use yansi::{Paint, Attribute};
painted.attr(Attribute::Bold);Make text bold using using bold().
use yansi::Paint;
painted.bold();§fn rapid_blink(&self) -> Painted<&T>
fn rapid_blink(&self) -> Painted<&T>
§fn quirk(&self, value: Quirk) -> Painted<&T>
fn quirk(&self, value: Quirk) -> Painted<&T>
Enables the yansi [Quirk] value.
This method should be used rarely. Instead, prefer to use quirk-specific
builder methods like mask() and
wrap(), which have the same functionality but are
pithier.
§Example
Enable wrapping using .quirk():
use yansi::{Paint, Quirk};
painted.quirk(Quirk::Wrap);Enable wrapping using wrap().
use yansi::Paint;
painted.wrap();§fn clear(&self) -> Painted<&T>
👎Deprecated since 1.0.1: renamed to resetting() due to conflicts with Vec::clear().
The clear() method will be removed in a future release.
fn clear(&self) -> Painted<&T>
resetting() due to conflicts with Vec::clear().
The clear() method will be removed in a future release.§fn whenever(&self, value: Condition) -> Painted<&T>
fn whenever(&self, value: Condition) -> Painted<&T>
Conditionally enable styling based on whether the [Condition] value
applies. Replaces any previous condition.
See the crate level docs for more details.
§Example
Enable styling painted only when both stdout and stderr are TTYs:
use yansi::{Paint, Condition};
painted.red().on_yellow().whenever(Condition::STDOUTERR_ARE_TTY);§impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
§impl<'p, T> Seq<'p, T> for Twhere
T: Clone,
impl<'p, T> Seq<'p, T> for Twhere
T: Clone,
§type Iter<'a> = Once<&'a T>
where
T: 'a
type Iter<'a> = Once<&'a T> where T: 'a
§fn contains(&self, val: &T) -> boolwhere
T: PartialEq,
fn contains(&self, val: &T) -> boolwhere
T: PartialEq,
§fn to_maybe_ref<'b>(item: <T as Seq<'p, T>>::Item<'b>) -> Maybe<T, &'p T>where
'p: 'b,
fn to_maybe_ref<'b>(item: <T as Seq<'p, T>>::Item<'b>) -> Maybe<T, &'p T>where
'p: 'b,
MaybeRef].