mirror of
https://github.com/simonw/sqlite-utils.git
synced 2026-09-24 19:04:12 +02:00
Improved column type introspection, closes #92
This commit is contained in:
parent
43f1c6ab4e
commit
1125460497
2 changed files with 21 additions and 14 deletions
|
|
@ -1,4 +1,4 @@
|
||||||
from .utils import sqlite3, OperationalError, suggest_column_types
|
from .utils import sqlite3, OperationalError, suggest_column_types, column_affinity
|
||||||
from collections import namedtuple, OrderedDict
|
from collections import namedtuple, OrderedDict
|
||||||
import datetime
|
import datetime
|
||||||
import hashlib
|
import hashlib
|
||||||
|
|
@ -65,15 +65,6 @@ if np:
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
REVERSE_COLUMN_TYPE_MAPPING = {
|
|
||||||
"": str, # Columns in views sometimes have type = ''
|
|
||||||
"TEXT": str,
|
|
||||||
"BLOB": bytes,
|
|
||||||
"INTEGER": int,
|
|
||||||
"FLOAT": float,
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
class AlterError(Exception):
|
class AlterError(Exception):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
@ -457,10 +448,7 @@ class Queryable:
|
||||||
@property
|
@property
|
||||||
def columns_dict(self):
|
def columns_dict(self):
|
||||||
"Returns {column: python-type} dictionary"
|
"Returns {column: python-type} dictionary"
|
||||||
return {
|
return {column.name: column_affinity(column.type) for column in self.columns}
|
||||||
column.name: REVERSE_COLUMN_TYPE_MAPPING[column.type]
|
|
||||||
for column in self.columns
|
|
||||||
}
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def schema(self):
|
def schema(self):
|
||||||
|
|
|
||||||
|
|
@ -33,3 +33,22 @@ def suggest_column_types(records):
|
||||||
t = str
|
t = str
|
||||||
column_types[key] = t
|
column_types[key] = t
|
||||||
return column_types
|
return column_types
|
||||||
|
|
||||||
|
|
||||||
|
def column_affinity(column_type):
|
||||||
|
# Implementation of SQLite affinity rules from
|
||||||
|
# https://www.sqlite.org/datatype3.html#determination_of_column_affinity
|
||||||
|
assert isinstance(column_type, str)
|
||||||
|
column_type = column_type.upper().strip()
|
||||||
|
if column_type == "":
|
||||||
|
return str # We differ from spec, which says it should be BLOB
|
||||||
|
if "INT" in column_type:
|
||||||
|
return int
|
||||||
|
if "CHAR" in column_type or "CLOB" in column_type or "TEXT" in column_type:
|
||||||
|
return str
|
||||||
|
if "BLOB" in column_type:
|
||||||
|
return bytes
|
||||||
|
if "REAL" in column_type or "FLOA" in column_type or "DOUB" in column_type:
|
||||||
|
return float
|
||||||
|
# Default is 'NUMERIC', which we currently also treat as float
|
||||||
|
return float
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue