使用 psycopg2 将 git 修订散列 (SHA-1) 写入 PostgreSQL 数据库
Writing a git revision hash (SHA-1) to a PostgreSQL database with psycopg2
短
将 git 修订散列 (SHA-1)(例如 f844cdc09651448d6c3e765fadac448253a16928
存储到 PostgreSQL database (> v.11) with psycopg2
中的最有效方法是什么?
详情和代码
我在 Python 中有一个 SHA-1 哈希作为十六进制字符串,我想将其存储在 PostgreSQL 数据库中:
import psycopg2
from subprocess import Popen, PIPE
psycopg2.__version__ # prints '2.9.1 (dt dec pq3 ext lo64)'
cmd_list = [ "git", "rev-parse", "HEAD", ]
process = Popen(cmd_list, stdout=PIPE, stderr=PIPE)
stdout, stderr = process.communicate()
git_sha1 = stdout.decode('ascii').strip()
conn = psycopg.connect(**DB_PARAMETERS)
curs = conn.cursor()
sql = """UPDATE table SET git_sha1 = %(git_sha1)s WHERE id=1;"""
curs.execute(
sql,
vars = {
"git_sha1": git_sha1
}
)
conn.commit()
conn.close()
目前我在数据库中有一个git_sha1
字段作为VARCHAR(40)
,但是作为git revision hash is an hexadecimal字符串,最好限制字符只是 [0-9a-f]。但是我觉得只为那个字段手动设置一个域是不舒服的......我觉得它应该存在一种更好更强大的方式来做到这一点。
那么,在 PostgreSQL 数据库中写入此类数据是否存在更好更优雅的方法?
版本控制:
- Python 3.6.9(默认,2021 年 1 月 26 日,15:33:00)
- git 版本 2.33.1
- psql (PostgreSQL) 12.4 (Ubuntu 12.4-1.pgdg18.04+1)
- Ubuntu18.04(5.4.0-87-通用x86_64GNU/Linux)
Git ID 为 SHA-1 checksums。这些表示为 40 个字符的十六进制字符串,但它们实际上是 20 个字节的数字。将它们存储为二进制数据:bytea
。这会将存储空间减少一半。
decode
the hex string when inserting, encode
取回时返回十六进制。
create temporary table foo ( git_id bytea );
insert into foo (git_id) values
(
decode('f844cdc09651448d6c3e765fadac448253a16928', 'hex')
);
select encode(git_id, 'hex') from foo;
在 psycop2 中,或者您可以将其转换为 bytes
,psycop 将执行正确的操作。
curs.execute(
sql,
vars = {
"git_sha1": bytes.fromhex(git_sha1)
}
)
请参阅 psycop 文档中的 Binary adaptation。
短
将 git 修订散列 (SHA-1)(例如 f844cdc09651448d6c3e765fadac448253a16928
存储到 PostgreSQL database (> v.11) with psycopg2
中的最有效方法是什么?
详情和代码
我在 Python 中有一个 SHA-1 哈希作为十六进制字符串,我想将其存储在 PostgreSQL 数据库中:
import psycopg2
from subprocess import Popen, PIPE
psycopg2.__version__ # prints '2.9.1 (dt dec pq3 ext lo64)'
cmd_list = [ "git", "rev-parse", "HEAD", ]
process = Popen(cmd_list, stdout=PIPE, stderr=PIPE)
stdout, stderr = process.communicate()
git_sha1 = stdout.decode('ascii').strip()
conn = psycopg.connect(**DB_PARAMETERS)
curs = conn.cursor()
sql = """UPDATE table SET git_sha1 = %(git_sha1)s WHERE id=1;"""
curs.execute(
sql,
vars = {
"git_sha1": git_sha1
}
)
conn.commit()
conn.close()
目前我在数据库中有一个git_sha1
字段作为VARCHAR(40)
,但是作为git revision hash is an hexadecimal字符串,最好限制字符只是 [0-9a-f]。但是我觉得只为那个字段手动设置一个域是不舒服的......我觉得它应该存在一种更好更强大的方式来做到这一点。
那么,在 PostgreSQL 数据库中写入此类数据是否存在更好更优雅的方法?
版本控制:
- Python 3.6.9(默认,2021 年 1 月 26 日,15:33:00)
- git 版本 2.33.1
- psql (PostgreSQL) 12.4 (Ubuntu 12.4-1.pgdg18.04+1)
- Ubuntu18.04(5.4.0-87-通用x86_64GNU/Linux)
Git ID 为 SHA-1 checksums。这些表示为 40 个字符的十六进制字符串,但它们实际上是 20 个字节的数字。将它们存储为二进制数据:bytea
。这会将存储空间减少一半。
decode
the hex string when inserting, encode
取回时返回十六进制。
create temporary table foo ( git_id bytea );
insert into foo (git_id) values
(
decode('f844cdc09651448d6c3e765fadac448253a16928', 'hex')
);
select encode(git_id, 'hex') from foo;
在 psycop2 中,或者您可以将其转换为 bytes
,psycop 将执行正确的操作。
curs.execute(
sql,
vars = {
"git_sha1": bytes.fromhex(git_sha1)
}
)
请参阅 psycop 文档中的 Binary adaptation。