python - Storm 或 SQLAlchemy ORM 是否允许从现有数据库创建模式?

标签 python mysql orm sqlalchemy storm-orm

考虑到 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 或任何 python ORM 或 python 数据库的类似逆向工程工具 fancyfier

最佳答案

我不知道 Storm 是如何管理这个过程的,但你肯定可以用 sqlalchemy 反射(reflect)数据库中的表。例如,下面是一个使用我目前可以访问的 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)

如果您只想一次反射(reflect)一张表,您可以使用以下代码。

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/

相关文章:

java - 如何将 hibernate 时间戳映射到 MySQL BIGINT?

python - PyQT 参数错误

Python recv 多播返回一个字节

python - Django:获取每个用户的发票、费用、提款。 (ORM) 关系

php - 数据将以哪个字符集存储在数据库中

mysql - Order by 使 mysql 变慢

ORM 框架

python - 我可以在 python 中传递 if 循环的自定义条件语句吗?

python - 重复 5 次 for 循环乘法

mysql - 从表中获取所有行并按条件连接另一个表中的一些行