考虑到storm是一个python orm,我想自动生成(mysql)数据库的模式。主页声明
“Storm可以很好地处理现有的数据库架构。”(https://storm.canonical.com/FrontPage),
因此,我希望不必创建模型类。但是,“入门”教程(https://storm.canonical.com/Tutorial)建议,需要为每个表手动创建类,并手动指定每个字段,如下所示:
class Person(object):
__storm_table__ = "person"
id = Int(primary=True)
name = Unicode()
或者,sqlalchemy似乎也不支持逆向工程功能,但确实需要这样的模式:
user = Table('user', metadata,
Column('user_id', Integer, primary_key = True),
Column('user_name', String(16), nullable = False),
Column('email_address', String(60)),
Column('password', String(20), nullable = False)
)
当然,这些类/模式是有意义的,因为每个表都可能表示一些“感兴趣的对象”,并且可以使用各种功能扩展它们。然而,它们的创建是乏味的,并且当数据库已经存在时,它们的(初始)内容是直接的。
允许逆向工程的一种orm是:
http://docs.doctrine-project.org/en/2.0.x/reference/tools.html
是否有类似的逆向工程工具用于Storm或SqlAlchemy或任何PythonORM或Python数据库爱好者?
最佳答案
我不知道Storm是如何管理这个过程的,但是您肯定可以用sqlalchemy反映数据库中的表。例如,下面是一个基本的示例,它使用了我目前可以访问的一个sql server实例。
AN ENTIRE DATABASE
>>> from sqlalchemy import create_engine, MetaData
>>> engine = create_engine('mssql+pyodbc://<username>:<password>@<host>/<database>') # replace <username> with user name etc.
>>> meta = MetaData()
>>> meta.reflect(bind=engine)
>>> funds_table = meta.tables['funds'] # tables are stored in meta.tables dict
>>> funds_table # now stores database schema object
Table(u'funds', MetaData(bind=None), Column(u'fund_token', INTEGER(), table=<funds>, primary_key=True, nullable=False), Column(u'award_year_token', INTEGER(), ForeignKey(u'award_year_defn.award_year_token'), table=<funds>, nullable=False), ... Column(u'fin_aid_disclosure_category', VARCHAR(length=3, collation=u'SQL_Latin1_General_CP1_CI_AS'), table=<funds>), Column(u'report_as_additional_unsub', BIT(), table=<funds>, server_default=DefaultClause(<sqlalchemy.sql.expression.TextClause object at 0x000000000545B6D8>, for_update=False)), schema=None)
如果一次只想反映一个表,可以使用以下代码。
ONE TABLE AT A TIME(更快)
>>> from sqlalchemy import Table, create_engine, MetaData
>>> engine = create_engine('mssql+pyodbc://<username>:<password>@<host>/<database>')
>>> meta = MetaData()
>>> funds_table = Table('funds', meta, autoload=True, autoload_with=engine) # indicate table name (here 'funds') with a string passed to Table as the first argument
>>> funds_table # now stores database schema object
Table(u'funds', MetaData(bind=None), Column(u'fund_token', INTEGER(), table=<funds>, primary_key=True, nullable=False), Column(u'award_year_token', INTEGER(), ForeignKey(u'award_year_defn.award_year_token'), table=<funds>, nullable=False), ... Column(u'fin_aid_disclosure_category', VARCHAR(length=3, collation=u'SQL_Latin1_General_CP1_CI_AS'), table=<funds>), Column(u'report_as_additional_unsub', BIT(), table=<funds>, server_default=DefaultClause(<sqlalchemy.sql.expression.TextClause object at 0x000000000545B6D8>, for_update=False)), schema=None)
正如您可能想象的那样,您可以保存相关表的数据,以便将来更快地再次访问这些表。
关于python - Storm或SQLAlchemy ORM是否允许从现有数据库创建模式?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23034471/