如何在 python 中从 postgres 数据库 insert/retrieve .mat( matlab ) 文件?

How do I insert/retrieve .mat( matlab ) files from postgres database in python?

环顾四周后,我编写了这个 insertion/retrieval 代码来读取 .mat 文件,将其发送到 bytea postgres 数据库列,然后尝试检索它并重新创建文件。

我使用 psycopg2 进行数据库交互。

插入:

    full_file_path = os.path.join( folder_path, single_file )
    f = open(full_file_path,'rb')
    file_data = psycopg2.Binary( f.read() )

    cur.execute( "INSERT INTO file_data_table "
        "( id, file_name, file_data, insertion_date) "
        "VALUES ( DEFAULT, %s, %s, %s)",
        (single_file, file_data, timestamp))

    f.close()
    conn.commit()
    print single_file + " inserted"

正在尝试检索并将其保存到文件(file_name 是 "something.mat")

cur = conn.cursor()

cur.execute( "SELECT encode( file_data, 'hex' ), file_name FROM file_data_table")
result = cur.fetchall()

print result[0][0]

for row in result:
    print row[1]
    full_file_path = os.path.join(folder_path, row[1])
    f = open(full_file_path,'w')
    f.write(row[0])
    f.close()

它从数据库中检索数据并成功将其保存在文件中,但该文件无法作为 mat 文件打开,并且文件大小比我尝试的原始文件大得多(大约两倍大)存储在数据库中。

我假设正在发生一些我没有正确处理的数据转换。

非常感谢任何帮助。

根据 Josh Kupershmidt 的提示,我发现了问题所在。

通过删除编码并将检索到的缓冲区转换为字符串,它现在似乎可以工作了。

cur = conn.cursor()

cur.execute( "SELECT file_data, file_name FROM file_data_table")
result = cur.fetchall()

print result[0][0]

for row in result:
    print row[1]
    full_file_path = os.path.join(folder_path, row[1])
    f = open(full_file_path,'w')
    f.write(str(row[0]))
    f.close()