python-3.x - 如何使用 psycopg2 读取和插入 bytea 列?

标签 python-3.x psycopg2 postgresql-9.3

我正在处理 Python复制一些 Postgresql 的脚本从一个环境到另一个环境的表(比 pg_dump 多一点)。它可以工作,除非我正在复制具有 bytea 的表。数据类型。

我读取内存中的源表数据,然后通过连接插入将内存转储到目标数据库中。

这是我产生插入语句的方法:

def generateInsert(self, argCachedRow):

    colOrd = 0;

    valClauseList = []

    hasBinary = False

    for colData in argCachedRow:
        colOrd += 1
        colName = self.colOrdLookup.get(colOrd)
        col = self.colLookup.get(colName)
        dataType = col.dataType

        insVal = None

        if colData is not None:

            strVal = str(colData)
            if dataType.useQuote:

                if "'" in strVal:
                    strVal = strVal.replace("'", "''")
                insVal = "'%s'" % strVal
            else:
                if dataType.binary:
                    hasBinary = True
                    #insVal = psycopg2.Binary(colData)
                #else:

                insVal = strVal
        else:
            insVal = "NULL"

        valClauseList.append(insVal)

    valClause = ", ".join(valClauseList)

    if hasBinary:
        valClause = psycopg2.Binary(valClause)

    result = "INSERT INTO %s VALUES (%s)" % (self.name, valClause)

    return result

它适用于每个没有二进制数据的表。

我还尝试(直观地)将二进制列数据包装在 psycopg2.Binary 中。 ,这是注释掉的行,然后不对整个行值列表执行此操作,但这也不起作用。

这是我的简单 DataType 包装器,它是通过读取 Postgres 的 information_schema 表来加载的:
class DataType(object):
    def __init__(self, argDispName, argSqlName, argUseQuote, argBin):
        self.dispName = argDispName
        self.sqlName = argSqlName
        self.useQuote = argUseQuote
        self.binary = argBin

如何使用 psycopg2 读取和插入 bytea 列?

最佳答案

如果你有这个数据库结构:

CREATE TABLE test (a bytea,
                   b int,
                   c text)
然后可以像这样将二进制数据插入请求中,而无需任何包装器:
bin_data = b'bytes object'
db = psycopg2.connect(*args)  # DB-API 2.0
c = db.cursor()
c.execute('''INSERT INTO test VALUES (%s, %s, %s)''', (bin_data, 1337, 'foo'))
c.execute('''UPDATE test SET a = %s''', (bin_data + b'1',))
然后,当您查询它时:
c.execute('''SELECT a FROM test''')
您将收到 memoryview ,很容易转换回 bytes :
mview = c.fetchone()
new_bin_data = bytes(mview)
print(new_bin_data)
输出:b'bytes object1'另外,我建议您不要通过字符串格式组合查询。 psycopg2的内置参数替换更方便,您不必担心验证数据以防止 SQL 注入(inject)。

关于python-3.x - 如何使用 psycopg2 读取和插入 bytea 列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40049046/

相关文章:

Python 和 Neo4j : Check for empty statementresult

python - 为什么 Pickle 协议(protocol) 4 中的 Pickle 文件是协议(protocol) 3 中的文件的两倍大,而速度却没有任何提升?

python - 如何通过迭代现有的 OSM 数据表在 PostgreSQL 中生成新表

json - 查询 Postgres 9.3 JSON 以检查数组是否包含字符串?

postgresql - 在 Amazon RDS (Postgresql) 上设置字符集

postgresql - 附加模块 citext 已安装,但未找到类型 "citext"?

python-3.x - KivyMD 中 MDDropdownMenu 的定位错误

python-3.x - 输入 0 与图层 flatten_5 : expected min_ndim=3, 发现 ndim=2 不兼容

postgresql - 用于数据库连接的 Flask before_request 和 teardown_request

python - psycopg2 无法执行多个查询