Generic vztah s sqlalchemy jako v Django CONTENTTYPES

hlasů
1

Snažím se udělat nějaké obecné aplikace pomocí SQL Alchemy, jako jsou štítky nebo ratingu pro každý model. Ale nemohl jsem najít žádnou pomoc v docs. Moc se mi líbilo, co jsem mohl udělat s rámcem Django CONTENTTYPES? Je nějaká podobná funkce v SQL alchymii?

Položena 22/03/2011 v 03:13
zdroj uživatelem
V jiných jazycích...                            


1 odpovědí

hlasů
3

Jednou jsem napsal nějaký příklad kódu na něco podobného k tomu (viz http://taketwoprogramming.blogspot.com/2009/08/reusable-sqlalchemy-models.html ).

Základní myšlenkou je, že můžete vytvořit model, jako je tento:

@commentable
class Post(Base):
    __tablename__ = 'posts'
    id = sa.Column(sa.Integer, primary_key=True)
    text = sa.Column(sa.String)

... kde commentable je definována takto ...

class BaseComment(object):
    pass

def build_comment_model(clazz):
    class_table_name = str(class_mapper(clazz).local_table)
    metadata = clazz.metadata

    comment_class_name = clazz.__name__ + 'Comment'
    comment_class = type(comment_class_name, (BaseComment,), {}) 

    comment_table_name = class_table_name + '_comments'
    comment_table = sa.Table(comment_table_name, metadata,
        sa.Column('id', sa.Integer, primary_key=True),
        sa.Column(class_table_name + '_id',
            sa.Integer,
            sa.ForeignKey(class_table_name + '.id')),

        sa.Column('text', sa.String),
        sa.Column('name', sa.String(100)),
        sa.Column('url', sa.String(255)),
    )   

    mapper(comment_class, comment_table)

    return comment_class, comment_table

def commentable(clazz):
    comment_class, comment_table = build_comment_model(clazz)

    clazz.Comment = comment_class
    setattr(clazz, 'comments', relation(comment_class))

    def add_comment(self, comment):
        self.comments.append(comment)

    setattr(clazz, 'add_comment', add_comment)

    return clazz

Zjednodušeně řečeno, commentable natěrač dynamicky vytváří nový typ a stůl, spolu s některými pomocných metod ke zdobené třídě. Jedná se o test I použít k testování, zda kód funguje, který ukazuje nějaký příklad toho, jak to bude fungovat ...

class TestModels(SATestCase):
    def test_make_comment(self):
        p = Post()
        p.text = 'SQLAlchemy is amazing!'

        text = 'I agree!'
        name = 'Mark'
        url = 'http://www.sqlalchemy.org/'

        c = Post.Comment()
        c.text = text
        c.name = name
        c.url = url 
        p.add_comment(c)
        Session.add(p)

        # This is a method I use to force the reload of the objects from
        # the database to make sure that when I test them, I'm actually
        # pulling from the database rather than just getting the data
        # of the object still in the session.
        p = self.reload(p)

        self.assertEquals(len(p.comments), 1)
        c = p.comments[0]
        self.assertEquals(c.text, text)
        self.assertEquals(c.name, name)
        self.assertEquals(c.url, url)

Napsal jsem tuto chvíli lety, ale nemyslím si, že je v SQLA něco, co bude dělat takové věci pro vás, ale můžete vytvořit něco podobného, ​​aniž by příliš mnoho problémů. V mém příkladu jsem vytvořil nové mapované třídy a metody jejich použití v reálném čase ve třídě dekoratér.

Nikdy jsem udělal hodně použití z ní, ale to by mohlo dát nějaké nápady.

Odpovězeno 22/03/2011 v 17:41
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more