2009-11-22 3 views
12

Betrachten Sie diese einfache Tabellendefinition (mit SQLAlchemy-0.5.6)Wie sqlalchemy Länge einer String-Spalte

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)) 

Ich möchte wissen, bekommen, was die maximale Länge der Spaltenname ist z.B. von Benutzertabelle und von Benutzern (deklarative Klasse)

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

Ich habe versucht (User.name.type.length) aber wirft es Ausnahme

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' 

Antwort

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

Hinweis, dass SQLAlchemy Verbundeigenschaften unterstützt, deshalb columns eine Liste ist. Es hat ein einzelnes Element für einfache Spalteneigenschaften.

+0

Ich mag würde mehr darüber lesen, aber nicht Bezug auf die 'property' finden überall Attribut in den offiziellen Dokumenten. Würde jemand so nett sein, einen Link zu posten? – KomodoDave

+1

Hier ist der Typ, den es zurückgibt: http://sqlalchemy.readthedocs.org/en/latest/orm/internals.html?highlight=strategisedproperty#sqlalchemy.orm.properties.ColumnProperty aber ich möchte @KomodoDave und zweitens @ frage mich, wo die Dokumentation für die Eigenschaft und die Spaltenattribute ist. Meine Mitarbeiter und ich haben Vorbehalte gegenüber der Verwendung undokumentierter Funktionalität. –

3

Dies soll (auf meinem Rechner getestet) Arbeit:

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

+ Dank es funktioniert, aber meine usecase war etwas anders, ich im Grunde declarative_base bin mit einer User-Klasse zu definieren, wie ich Länge von Klasse zu bekommen, bitte modifizierte Frage –

+1

'Druck User.name.type.length' sehen tut nicht arbeiten ? –

+0

ja, es wirft Ausnahme ‚Attribute: Weder‚InstrumentedAttribute‘Objekt noch‚Vergleicher‘Objekt hat ein Attribut‚type‘‘ update Frage –