2009-11-22 27 views
12

considerar esta definición de tabla simple (utilizando SQLAlchemy-0.5.6)Como llegar sqlalchemy longitud de una columna de cadena

from sqlalchemy import * 

db = create_engine('sqlite:///tutorial.db') 

db.echo = False # Try changing this to True and see what happens 

metadata = MetaData(db) 

user = Table('user', metadata, 
    Column('user_id', Integer, primary_key=True), 
    Column('name', String(40)), 
    Column('age', Integer), 
    Column('password', String), 
) 

from sqlalchemy.ext.declarative import declarative_base 

class User(declarative_base()): 

    __tablename__ = 'user' 
    user_id = Column('user_id', Integer, primary_key=True) 
    name = Column('name', String(40)) 

Quiero saber cuál es la longitud máxima de nombre de la columna, por ejemplo, de tabla de usuario y de usuario (clase declarativa)

print user.name.length 
print User.name.length 

me han tratado (User.name.type.length) pero ha producido una excepción

Traceback (most recent call last): 
    File "del.py", line 25, in <module> 
    print User.name.type.length 
    File "/usr/lib/python2.5/site-packages/SQLAlchemy-0.5.6-py2.5.egg/sqlalchemy/orm/attributes.py", line 135, in __getattr__ 
    key) 
AttributeError: Neither 'InstrumentedAttribute' object nor 'Comparator' object has an attribute 'type' 

Respuesta

16
User.name.property.columns[0].type.length 

Nota, que apoya SQLAlchemy propiedades del compuesto, es por eso que columns es una lista. Tiene un solo elemento para propiedades de columna simples.

+0

Me gustaría leer más sobre esto pero no puedo encontrar referencia al atributo 'property' en cualquier lugar en los documentos oficiales. ¿Alguien sería tan amable de publicar un enlace? – KomodoDave

+1

Aquí está el tipo que devuelve: http://sqlalchemy.readthedocs.org/en/latest/orm/internals.html?highlight=strategizedproperty#sqlalchemy.orm.properties.ColumnProperty pero me gustaría secundar @KomodoDave y preguntarse dónde está la documentación para los atributos de propiedades y columnas. Mis compañeros de trabajo y yo tenemos reservas sobre el uso de la funcionalidad no documentada. –

3

Esto debería funcionar (probado en mi máquina):

print user.columns.name.type.length 
+0

+ gracias funciona, pero mi uso era un poco diferente, básicamente estoy usando declarative_base para definir una clase de usuario, ¿cómo puedo obtener la longitud de la clase, por favor ver la pregunta modificada –

+1

'print User.name.type.length' hace no trabajo ? –

+0

sí arroja la excepción 'AttributeError: Ni el objeto' InstrumentedAttribute 'ni el objeto' Comparator 'tienen un atributo' tipo '' de actualización Pregunta –

Cuestiones relacionadas