如何获取sqlalchemy字符串列的长度

18 投票
4 回答
21021 浏览
提问于 2025-04-15 16:15

考虑这个简单的表定义(使用 SQLAlchemy-0.5.6)

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

我想知道,比如用户表中的列名最大长度是多少,以及从 User(声明类)中获取的列名最大长度。

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

我试过用 (User.name.type.length),但是它报错了。

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'

4 个回答

1

如果你能访问这个类:

TableClass.column_name.type.length

如果你能访问一个实例,你可以通过 __class__ 这个特殊的方法来获取这个类。

table_instance.__class__.column_name.type.length

所以在你的情况下:

# Via Instance
user.__class__.name.type.length
# Via Class
User.name.type.length

我的使用情况和 @Gregg Williamson 的类似,不过我实现的方式不太一样:

def __setattr__(self, attr, value):
    column = self.__class__.type
    if length := getattr(column, "length", 0):
        value = value[:length]
    super().__setattr__(name, value)
3

这个应该可以用(我在我的电脑上测试过):

print user.columns.name.type.length
23
User.name.property.columns[0].type.length

请注意,SQLAlchemy支持复合属性,这就是为什么columns是一个列表的原因。对于简单的列属性,它只包含一个项目。

撰写回答