views:

184

answers:

1

I used sqlautocode to generate a model.py for an existing MySQL database and here's a table example:

fusion_articles =  Table('fusion_articles', metadata,
    Column(u'article_id', Integer(), primary_key=True, nullable=False),
            Column(u'article_cat', Integer(), primary_key=False, nullable=False),
            Column(u'article_subject', String(length=200, convert_unicode=False, assert_unicode=None), primary_key=False, nullable=False),
            Column(u'article_snippet', Text(length=None, convert_unicode=False, assert_unicode=None), primary_key=False, nullable=False),
            Column(u'article_article', Text(length=None, convert_unicode=False, assert_unicode=None), primary_key=False, nullable=False),
            Column(u'article_breaks', CHAR(length=1, convert_unicode=False, assert_unicode=None), primary_key=False, nullable=False),
            Column(u'article_name', Integer(), primary_key=False, nullable=False),
            Column(u'article_datestamp', Integer(), primary_key=False, nullable=False),
            Column(u'article_reads', Integer(), primary_key=False, nullable=False),
            Column(u'article_allow_comments', Boolean(), primary_key=False, nullable=False),
            Column(u'article_allow_ratings', Boolean(), primary_key=False, nullable=False),


    )

Some of the examples I've seen prefixed the Column, Integer() and other similar datatypes with schema that's imported from sqlalchemy. Should I import Column and the rest individually, such as:

>>> from sqlalchemy import Table, Column, Integer, String, MetaData
>>> metadata = MetaData()

Or should I always prefix them?

schema.Table, meta.metadata

+1  A: 

It's largely a style preference, but also depends on how complex your code is.

If you're writing a short, isolated script that will likely not be imported elsewhere, bringing lots of names into your namespace (i.e. Table, Column) isn't a problem and makes the code easier to read.

If, on the other hand, you expect your module to be large and imported by other modules or third parties, you want to keep you namespace as clean as possible. Having the Table and MetaData classes in a separate namespace keeps them organized and clearly scoped. That is, if you're using the schema namespace, you can clearly tell that

>>> schema.Table

refers to the Table in the schema module and not another Table defined elsewhere.

Otherwise, the objects are exactly the same.

>>> from sqlalchemy import schema
>>> from sqlalchemy import Table
>>> Table is schema.Table
True
Jason R. Coombs
In my case this is in a `model/__init__.py` script used in a `Pylons` application, I guess I should prefix it then.
meder