SQLAlchemy 0.5.5 - 定义表结构

0 投票
1 回答
697 浏览
提问于 2025-04-15 16:01

我使用了 sqlautocode 工具来为一个现有的 MySQL 数据库生成了一个 model.py 文件,下面是一个表的例子:

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


    )

我看到的一些例子中,ColumnInteger() 以及其他类似的数据类型前面都加上了 schema,这个是从 sqlalchemy 导入的。那我是不是应该单独导入 Column 和其他的呢,比如:

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

还是说我应该总是加上前缀呢?

schema.Tablemeta.metadata

1 个回答

1

这主要是个人风格的选择,但也和你的代码复杂程度有关。

如果你在写一个短小的、独立的脚本,而且这个脚本可能不会被其他地方引用,那么把很多名字放到你的命名空间里(比如 Table 和 Column)就没什么问题,这样反而让代码更容易阅读。

但如果你预计你的模块会很大,并且会被其他模块或第三方使用,那么你就要尽量保持命名空间的整洁。把 Table 和 MetaData 类放在一个单独的命名空间里,可以让它们更有条理,也更清晰。也就是说,如果你使用的是 schema 命名空间,你就能很清楚地知道

>>> schema.Table

指的是 schema 模块中的 Table,而不是其他地方定义的 Table。

否则,这些对象其实是完全一样的。

>>> from sqlalchemy import schema
>>> from sqlalchemy import Table
>>> Table is schema.Table
True

撰写回答