| import sqlite3 |
| |
| class Point: |
| def __init__(self, x, y): |
| self.x, self.y = x, y |
| |
| def __repr__(self): |
| return f"Point({self.x}, {self.y})" |
| |
| def adapt_point(point): |
| return f"{point.x};{point.y}".encode("utf-8") |
| |
| def convert_point(s): |
| x, y = list(map(float, s.split(b";"))) |
| return Point(x, y) |
| |
| # Register the adapter and converter |
| sqlite3.register_adapter(Point, adapt_point) |
| sqlite3.register_converter("point", convert_point) |
| |
| # 1) Parse using declared types |
| p = Point(4.0, -3.2) |
| con = sqlite3.connect(":memory:", detect_types=sqlite3.PARSE_DECLTYPES) |
| cur = con.execute("create table test(p point)") |
| |
| cur.execute("insert into test(p) values (?)", (p,)) |
| cur.execute("select p from test") |
| print("with declared types:", cur.fetchone()[0]) |
| cur.close() |
| con.close() |
| |
| # 2) Parse using column names |
| con = sqlite3.connect(":memory:", detect_types=sqlite3.PARSE_COLNAMES) |
| cur = con.execute("create table test(p)") |
| |
| cur.execute("insert into test(p) values (?)", (p,)) |
| cur.execute('select p as "p [point]" from test') |
| print("with column names:", cur.fetchone()[0]) |
| cur.close() |
| con.close() |