如何将MySQLdb的fetchall()的输出转换为文件流?

2024-05-17 09:53:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个python方法来转储MySQL表的全部内容。但是,此表包含个人身份信息(PII)。我要求这些数据必须是GPG加密的。另外,要求是这些数据都不允许以未加密的形式写入磁盘(即使这只是一个临时文件,稍后会被删除)

通过使用subprocess.Popen()并将mysql可执行文件的输出直接发送到gpg可执行文件,然后将输出管道发送到stdout,从而暂时解决了这个问题:

    p1 = subprocess.Popen(
        'mysql -h127.0.0.1 -Dmydbinstance -umyuser -pmyPassword -e "select * from my_table"',
        stdin=subprocess.PIPE,
        stdout=subprocess.PIPE,
    )

    p2 = subprocess.Popen(
        "gpg --encrypt -r myemail@gmail.com",
        stdin=p1.stdout,
        stdout=subprocess.PIPE
    )

    p1.stdout.close()
    print p2.communicate()[0]

它很管用,但在我看来这是一次可怕的黑客攻击。使用fork shell进程来执行此操作感觉非常错误。在

所以我想用python本机实现这一点(不使用popen())。我有到数据库的MySQLdb连接。并且python-gnupg模块可以对文件流进行加密。但是如何将MySQLdb的fetchall()的输出转换为文件流呢?到目前为止,我只知道:

^{pr2}$

如何将fetchall()的输出转换为文件流,以便可以将其发送到gpg.encrypt_file(),而无需将临时文件写入未加密的磁盘?可能有数百万行数据。因此,一次把它全部读入内存并不是一个可行的解决方案。在


Tags: 文件数据可执行文件stdinstdoutmysqlgpg磁盘
1条回答
网友
1楼 · 发布于 2024-05-17 09:53:36

您可以使用类似于io.StringIO或{}的类似于io module的对象。在

看一下最新的source code不再有encrypt_file,而是使用StringIO or BytesIO depending on the Python Version}wraps the data in a binary stream

因此,实际上没有什么可以阻止您直接使用encrypt,如果您想要更多地控制数据的加密方式,您可以实现一个虚拟文件对象,或者只将数据写入io.BytesIO对象。在

相关问题 更多 >