使用Tcl / Tk打开存储在Sqlite中的Blob数据作为文件

时间:2010-05-17 18:26:27

标签: sqlite blob tcl

我正在使用以下tcl代码将我的deskstop中的文件存储到Sqlite数据库中作为blob数据($fileText是文本文件的路径):

sqlite3 db Docs.db
set fileID [open $fileText RDONLY]
fconfigure $fileID -translation binary
set content [read $fileID]
close $fileID
db eval {insert into Document (Doc) VALUES ($content)}
db close

我找到了很多关于如何打开blob数据来读取和写入的资源,但是我找不到任何关于将blob数据作为文件打开的资源。例如,如果$ fileText是pdf,我将如何从Sqlite打开它作为pdf?

1 个答案:

答案 0 :(得分:1)

当您说“以PDF格式打开”时,我认为您的意思是您希望某些外部程序将数据视为文件?唯一的方法是:

  1. 在Linux上使用用户模式文件系统(或操作系统上的等效文件系统)做一些聪明的恶作剧,以便实际安装数据库,或
  2. 将数据库中的数据复制到具有正确名称的临时文件中(提示:将其保存为该表中的单独列)。
  3. 还将它作为一个网络服务器呈现,但这真的是第二个与浏览器混合;数据仍然被复制。

    另一方面,如果您要做的就是将数据作为可以从Tcl读取或写入的流,那么sqlite3包就可以满足您的需求:

    dbcmd incrblob ?-readonly? ?db? table column rowid

    返回标准通道句柄(虽然没有一个由OS句柄备份,因此如果使用exec作为重定向时要小心。)


    [编辑]:以下是如何获取数据(当然,用一个子句替换...以获得正确的行):

    # Open the DB
    sqlite3 db Docs.db
    
    # Open the file to write to
    set fileID [open $fileText w]
    fconfigure $fileID -translation binary
    
    # Write the BLOB
    db eval {SELECT Doc FROM Document WHERE ... LIMIT 1} row {
        puts -nonewline $fileID $row(Doc)
    }
    
    # We're done!
    close $fileID
    db close
    

    不要担心BLOB的大小; Tcl sqlite3包有效地传递它。如果你仍然担心,这是另一种方式(同样,你需要适当地替换...):

    # Open the DB
    sqlite3 db Docs.db
    
    # Open the file to write to
    set fileOut [open $fileText w]
    fconfigure $fileOut -translation binary
    
    # Get the BLOB as a (read-only) channel
    set fdBlob [db incrblob -readonly Document Doc ...]
    fconfigure $fdBlob -translation binary
    
    # Do the copy 
    fcopy $fileOut $fdBlob
    
    # We're done!
    close $fdBlob
    close $fileOut
    db close