将图像作为斑点存储在Sqlite成功中,但是可以阅读吗?

发布于 2025-02-11 05:50:17 字数 2743 浏览 1 评论 0原文

更新:

添加我的cargo.toml在需要时:

serde = { version = "1.0.117", default-features = false }
serde_json = "1.0.66"
sql-builder = "3.1"
sqlite = "0.26.0"

更新:

我做了@cdhowie在评论中说,添加println! );,它是打印字符串

这是我错误地存储错误的方式,不应该使用serde_json :: to_string或其他东西吗?


OP:

我写了一个演示来学习sqlite和rust,这里的代码:

use std::{fs::File, io::{Read, Write}};

use sql_builder::{quote, SqlBuilder};
use sqlite::Connection;
fn main() {
    // create sqlite databases on ./tmp/sqlite.db
    let conn = Connection::open("./tmp/sqlite.db").unwrap();

    // create table
    conn.execute(
        "CREATE TABLE IF NOT EXISTS icon (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            name TEXT,
            content BLOB,
            used STRING
        )",
    )
    .unwrap();

    // read image file from disk and store to sqlite as blob
    let mut file = File::open("./tmp/in.jpg").unwrap();
    let mut contents = Vec::new();
    file.read_to_end(&mut contents).unwrap();
    println!("{:?}", contents);

    // build sql query
    let sql = SqlBuilder::insert_into("icon")
    .fields(&["name", "content", "used"])
        .values(&[
            quote(serde_json::to_string("in").unwrap()),
            quote(serde_json::to_string(&contents).unwrap()),
            quote(serde_json::to_string("1").unwrap()),
        ])
        .sql().unwrap();

    // execute query
    conn.execute(&sql).unwrap();

    // read image file from sqlite and store to disk
    let mut builder = SqlBuilder::select_from("icon");
        builder.field("id");
        builder.field("name");
        builder.field("content");
        builder.field("used");
    let stmt = conn.prepare(&builder.sql().unwrap()).unwrap();

    let mut cursor = stmt.into_cursor();
    let row = cursor.next().unwrap().unwrap();
    let id = row[0].as_integer().unwrap();
    let name = row[1].as_string().unwrap();
    let content = row[2].as_binary().unwrap(); // src/main.rs:51:38
    let used = row[3].as_string().unwrap();

    println!("{} {} {}", id, name, used);

    let mut file = File::create("./tmp/out.jpg").unwrap();
    file.write_all(content).unwrap();
}

运行此代码时,会出现错误:

thread 'main' panicked at 'called `Option::unwrap()` on a `None` value', src/main.rs:51:38

但是在哪里检查sqlite.db文件,它显示:

“

https://i.sstatic.net/sfllc.png存储成功。但是,如何修复代码使读取表单sqlite并存储以工作呢?

如果您需要更多信息,请告诉我。 :)

Update:

add my Cargo.toml in case needed:

serde = { version = "1.0.117", default-features = false }
serde_json = "1.0.66"
sql-builder = "3.1"
sqlite = "0.26.0"

Update:

i did @cdhowie says on comment, add println!("{:?}", row[2].kind());, it's print String.

it's the way i store blob wrong, shouldn't use serde_json::to_string or something?


OP:

i writed a demo to learn sqlite and rust, here the code:

use std::{fs::File, io::{Read, Write}};

use sql_builder::{quote, SqlBuilder};
use sqlite::Connection;
fn main() {
    // create sqlite databases on ./tmp/sqlite.db
    let conn = Connection::open("./tmp/sqlite.db").unwrap();

    // create table
    conn.execute(
        "CREATE TABLE IF NOT EXISTS icon (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            name TEXT,
            content BLOB,
            used STRING
        )",
    )
    .unwrap();

    // read image file from disk and store to sqlite as blob
    let mut file = File::open("./tmp/in.jpg").unwrap();
    let mut contents = Vec::new();
    file.read_to_end(&mut contents).unwrap();
    println!("{:?}", contents);

    // build sql query
    let sql = SqlBuilder::insert_into("icon")
    .fields(&["name", "content", "used"])
        .values(&[
            quote(serde_json::to_string("in").unwrap()),
            quote(serde_json::to_string(&contents).unwrap()),
            quote(serde_json::to_string("1").unwrap()),
        ])
        .sql().unwrap();

    // execute query
    conn.execute(&sql).unwrap();

    // read image file from sqlite and store to disk
    let mut builder = SqlBuilder::select_from("icon");
        builder.field("id");
        builder.field("name");
        builder.field("content");
        builder.field("used");
    let stmt = conn.prepare(&builder.sql().unwrap()).unwrap();

    let mut cursor = stmt.into_cursor();
    let row = cursor.next().unwrap().unwrap();
    let id = row[0].as_integer().unwrap();
    let name = row[1].as_string().unwrap();
    let content = row[2].as_binary().unwrap(); // src/main.rs:51:38
    let used = row[3].as_string().unwrap();

    println!("{} {} {}", id, name, used);

    let mut file = File::create("./tmp/out.jpg").unwrap();
    file.write_all(content).unwrap();
}

when i run this code, will got error:

thread 'main' panicked at 'called `Option::unwrap()` on a `None` value', src/main.rs:51:38

but where i check the sqlite.db file, it shows:

vscode sqlite viewer

dbeaver

seems file stored success. but how can i fix the code make read form sqlite and store to disk work?

if you guys need more info, please let me know. :)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

浪推晚风 2025-02-18 05:50:17

我现在可以解决这个问题,但这可能不是最好的解决方案。

// ...
let content = row[2].as_string().unwrap();
// ...

// ...
let content: Vec<u8> = serde_json::from_str(&content).unwrap();
file.write_all(&content).unwrap();
// ...

另外,我可能已经找到了一个更好的SQL生成液体,称为柴油

也许当我继续学习时,我可能会发现一种更好,更优雅的方式。无论如何,它现在正在工作。 :)

I can fix the issue now, but this may not be the best solution.

// ...
let content = row[2].as_string().unwrap();
// ...

// ...
let content: Vec<u8> = serde_json::from_str(&content).unwrap();
file.write_all(&content).unwrap();
// ...

also, I may have found a better one SQL generation lib, called diesel.

Maybe as I keep learning, I might find a better, more elegant way. Anyway, it's working now. :)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文