Skip to content

Commit 4764b5b

Browse files
Added support for Bit objects with Psycopg 2 and pg8000
1 parent e0f3ac3 commit 4764b5b

5 files changed

Lines changed: 40 additions & 3 deletions

File tree

‎pgvector/pg8000/register.py‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from pg8000.native import Connection
22
from typing import cast
3-
from .. import Vector, HalfVector, SparseVector
3+
from .. import Bit, Vector, HalfVector, SparseVector
44

55

66
def register_vector(conn: Connection, /) -> None:
@@ -14,6 +14,8 @@ def register_vector(conn: Connection, /) -> None:
1414
conn.register_out_adapter(Vector, lambda v: v.to_text())
1515
conn.register_in_adapter(type_info['vector'], Vector.from_text)
1616

17+
conn.register_out_adapter(Bit, lambda v: v.to_text())
18+
1719
try:
1820
import numpy as np
1921
conn.register_out_adapter(np.ndarray, lambda v: Vector(v).to_text())

‎pgvector/psycopg2/bit.py‎

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
from psycopg2.extensions import adapt, register_adapter
2+
from typing import Any
3+
from .. import Bit
4+
5+
6+
class BitAdapter:
7+
def __init__(self, value: Bit) -> None:
8+
self._value = value
9+
10+
def getquoted(self) -> Any:
11+
return adapt(self._value.to_text()).getquoted()
12+
13+
14+
def register_bit_info() -> None:
15+
register_adapter(Bit, BitAdapter)

‎pgvector/psycopg2/register.py‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import psycopg2
22
from psycopg2.extensions import connection, cursor
3+
from .bit import register_bit_info
34
from .halfvec import register_halfvec_info
45
from .sparsevec import register_sparsevec_info
56
from .vector import register_vector_info
@@ -20,6 +21,8 @@ def register_vector(conn_or_curs: connection | cursor, /, *, globally: bool = Fa
2021

2122
register_vector_info(type_info['vector'], type_info['_vector'] if arrays else None, scope)
2223

24+
register_bit_info()
25+
2326
if 'halfvec' in type_info:
2427
register_halfvec_info(type_info['halfvec'], type_info['_halfvec'] if arrays else None, scope)
2528

‎tests/test_pg8000.py‎

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from getpass import getuser
2-
from pgvector import HalfVector, SparseVector, Vector
2+
from pgvector import Bit, HalfVector, SparseVector, Vector
33
from pgvector.pg8000 import register_vector
44
from pg8000.native import Connection
55
from .conftest import numpy as np
@@ -42,6 +42,14 @@ def test_bit(self) -> None:
4242
res = conn.run('SELECT binary_embedding FROM pg8000_items ORDER BY id')
4343
assert res == [['101'], [None]]
4444

45+
def test_bit_class(self) -> None:
46+
embedding = Bit([True, False, True])
47+
embedding2 = None
48+
conn.run('INSERT INTO pg8000_items (binary_embedding) VALUES (:embedding), (:embedding2)', embedding=embedding, embedding2=embedding2)
49+
50+
res = conn.run('SELECT binary_embedding FROM pg8000_items ORDER BY id')
51+
assert res == [['101'], [None]]
52+
4553
def test_sparsevec(self) -> None:
4654
embedding = SparseVector([1.5, 2, 3])
4755
embedding2 = None

‎tests/test_psycopg2.py‎

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from pgvector import HalfVector, SparseVector, Vector
1+
from pgvector import Bit, HalfVector, SparseVector, Vector
22
from pgvector.psycopg2 import register_vector
33
import psycopg2
44
from psycopg2.extras import DictCursor, RealDictCursor, NamedTupleCursor
@@ -61,6 +61,15 @@ def test_bit(self) -> None:
6161
assert res[0][0] == embedding
6262
assert res[1][0] is None
6363

64+
def test_bit_class(self) -> None:
65+
embedding = Bit([True, False, True])
66+
cur.execute('INSERT INTO psycopg2_items (binary_embedding) VALUES (%s), (NULL)', (embedding,))
67+
68+
cur.execute('SELECT binary_embedding FROM psycopg2_items ORDER BY id')
69+
res = cur.fetchall()
70+
assert res[0][0] == '101'
71+
assert res[1][0] is None
72+
6473
def test_sparsevec(self) -> None:
6574
embedding = SparseVector([1.5, 2, 3])
6675
cur.execute('INSERT INTO psycopg2_items (sparse_embedding) VALUES (%s), (NULL)', (embedding,))

0 commit comments

Comments
 (0)