2015-01-11 1 views
5

E 'possibile interrogare una colonna per la sua massima possibile dimensione dei dati (in byte) che possono essere memorizzati in esso? Ad esempio, dire dichiaro una colonna utilizzandoSQLAlchemy: l'ispezione di dimensioni tipo colonna indica risultato strano

content = Column(LargeBinary) 

allora come posso interrogare informazioni su content? Seguendo l'approccio inspection suggerito this domanda:

table = File.__table__ 
field = table.c["content"] 
print("max=" + field.type.length) 

ho un max=None, mentre mi sarei aspettato questo per essere max=65535 considerando field.type=BLOB. Che cosa sto facendo di sbagliato?

risposta

4

Per quanto ho capito, la lunghezza massima di una colonna è numero di dialetto e queste informazioni non sono memorizzate all'interno delle origini sqlalchemy. Tuttavia, a seconda del back-end, puoi ottenerlo in modo dinamico. Ad esempio, per mysql è possibile recuperare da INFORMATION_SCHEMA.COLUMNS table:

q = select(["CHARACTER_MAXIMUM_LENGTH"]).select_from("INFORMATION_SCHEMA.COLUMNS").where(
    and_("table_name = '%s'" % File.__tablename__, 
     "table_schema = '%s'" % schema, 
     "column_name = '%s'" % column_name)) 
result = session.execute(q) 
print(result.first()[0]) # tested - prints 65535 

Scommetto c'è un modo più bello di scrivere la query.

Vedi anche:


field.type.length riferisce alla lunghezza massima definita dall'utente che è initialized to None if not provided explicitly:

def __init__(self, length=None): 
    self.length = length 

E poiché non si fornisce l'argomento length, si ottiene None.

+0

Ha funzionato come un fascino! Interrogare direttamente il DB usando 'q' sopra mi dà le dimensioni corrette dei tipi di dati come definiti [qui] (http://dev.mysql.com/doc/refman/5.0/en/storage-requirements.html). Per l'implementazione dell'alchimia, ho ora usato un limite artificiale impostando 'self.length' che mappa in un SQL MEDIUMBLOB. – Jens