¿Cuál es la forma más eficiente y efectiva de almacenar un hash de revisión de git (SHA-1) como f844cdc09651448d6c3e765fadac448253a16928 en una base de datos PostgreSQL (> v.11) con psycopg2 ?
Tengo un hash SHA-1 como cadena hexadecimal en Python, que me gustaría almacenar en una base de datos 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() Por el momento, tengo un campo git_sha1 en la base de datos como VARCHAR(40) , pero como un hash de revisión de git es una cadena hexadecimal , puede ser mejor restringir los caracteres para que solo sean [0-9a-f]. Pero no me siento cómodo configurando manualmente un dominio solo para ese campo... Tengo la sensación de que debería existir una forma mejor y más robusta de hacerlo.
Entonces, ¿existe una forma mejor y más elegante de escribir este tipo de datos en una base de datos PostgreSQL ?
Versionado:
Los ID de Git son sumas de comprobación SHA-1 . Estos se representan como cadenas hexadecimales de 40 caracteres, pero en realidad son números de 20 bytes. Guárdelos como datos binarios: bytea . Esto reducirá el almacenamiento a la mitad.
decode la cadena hexadecimal al insertar, encode de nuevo a hexadecimal al buscar.
create temporary table foo ( git_id bytea ); insert into foo (git_id) values ( decode('f844cdc09651448d6c3e765fadac448253a16928', 'hex') ); select encode(git_id, 'hex') from foo; En psycop2, o puede convertirlo a bytes y psycop hará lo correcto.
curs.execute( sql, vars = { "git_sha1": bytes.fromhex(git_sha1) } )Consulte Adaptación binaria en los documentos de psycop.