4 个版本

0.2.0 2022 年 12 月 15 日
0.1.2 2022 年 11 月 27 日
0.1.1 2022 年 11 月 24 日
0.1.0 2022 年 11 月 24 日

#1451数据库接口

MIT/Apache

26KB
490

雪崩连接器

正在积极开发中。 目前最好直接指向 git,而不是 crates.io。

用法

将以下行添加到 Cargo.toml

snowflake-connector = { version = "0.2", features = ["derive"] }

目前,仅支持 密钥对身份验证

您必须在应用程序执行目录下有文本文件 environment_variables/snowflake_private_key_path.txtenvironment_variables/snowflake_public_key_path.txt,这些文件必须存储密钥的路径。

开发设置

将您的公钥和私钥添加到 environment_variables/local 文件夹下(您需要创建 local 文件夹)。确保您的私钥命名为 rsa_key.p8,您的公钥为 rsa_key.pub

通过更改其内容为 ./environment_variables/local/rsa_key.p8,将 environment_variables/snowflake_private_key_path.txt 指向您的私钥

environment_variables/snowflake_public_key_path.txt 指向您的公钥: ./environment_variables/local/rsa_key.pub

确保忽略 environment_variables 目录。您不希望将密钥提交到仓库。

工作原理

以下示例未经过测试,但您可以得到基本思路

use snowflake_connector::{*, errors::SnowflakeError};

fn get_from_snowflake() -> Result<SnowflakeSQLResult<Test>, SnowflakeError> {
    let connector = SnowflakeConnector::try_new("COMPANY.ACCOUNT", "ACCOUNT", "[email protected]")?;
    connector
        .execute("DB", "WH")
        .sql("SELECT * FROM TEST_TABLE WHERE id = ? LIMIT 69")?
        .add_binding(420)
        .select::<Test>().await
}

fn main() {
    if let Ok(data) = get_from_snowflake() {
        println!("{:#?}", data)
    } else {
        panic!("Failed to retrieve data from snowflake!");
    }
}

// Fields must be in order of columns!
#[derive(SnowflakeDeserialize, Debug)]
pub struct Test {
    pub id: u32,
    pub value1: bool,
    pub value2: String,
    pub value3: SomeEnumValue,
}

// Enum must implement DeserializeFromStr!
#[derive(Debug)]
pub enum SomeEnumValue {
    Value1,
    Value2,
}

// Snowflake sends each cell as a string,
// convert the string to the appropriate type!
impl DeserializeFromStr for SomeEnumValue {
    type Err = anyhow::Error;
    fn deserialize_from_str(s: &str) -> Result<Self, Self::Err> {
        match s {
            "VALUE1" => Ok(SomeEnumValue::Value1),
            "VALUE2" => Ok(SomeEnumValue::Value2),
            _ => Err(anyhow::anyhow!("Failed to convert string to SomeEnumValue")),
        }
    }
}

Snowflake 返回每个值作为字符串。为可以从字符串解析的类型实现 DeserializeFromStr。将 SnowflakeDeserialize derive 属性添加到 struct 以允许 SnowflakeConnector 将数据转换为该类型。目前,字段的顺序必须与列的顺序相对应。假设字段从上到下排列,因此最上面的字段必须是第一列,最下面的字段必须是最后一列,否则反序列化将失败。

依赖关系

~12–24MB
~387K SLoC