Est*_*ber 45 python sqlalchemy
有两个(三个,但我不算Elixir,因为它不是"官方")用SQLAlchemy定义持久化对象的方法:
from sqlalchemy import Table, Column, Integer, String, MetaData, ForeignKey
from sqlalchemy.orm import mapper
metadata = MetaData()
users_table = Table('users', metadata,
Column('id', Integer, primary_key=True),
Column('name', String),
)
class User(object):
def __init__(self, name):
self.name = name
def __repr__(self):
return "<User('%s')>" % (self.name)
mapper(User, users_table) # <Mapper at 0x...; User>
Run Code Online (Sandbox Code Playgroud)
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String)
def __init__(self, name):
self.name = name
def __repr__(self):
return "<User('%s')>" % (self.name)
Run Code Online (Sandbox Code Playgroud)
我可以看到,在使用mapper对象时,我将ORM定义与业务逻辑完全分开,同时使用声明性语法,每当我修改业务逻辑类时,我都可以在那里编辑数据库类(理想情况下应该对其进行编辑) ).
我不完全确定的是,哪种方法对于业务应用程序更易于维护?
我无法在两种映射方法之间找到比较,以便能够确定哪一种更适合我的项目.
我倾向于使用"正常"方式(即不是声明性扩展),因为它允许我"隐藏",并且不使用所有ORM逻辑的业务视图,但我想听到两个令人信服的论点方法.
S.L*_*ott 24
"我不完全确定,哪种方法对业务应用程序更易于维护?"
一般都无法回答.
但是,考虑一下.
Django ORM是严格声明的 - 人们喜欢这样.
SQLAlchemy做了几件事,并非所有事情都与所有问题相关.
SQLAlchemy从通用Python创建特定于DB的SQL.如果你想搞乱SQL,或者将Python类映射到现有表,那么你必须使用显式映射,因为你的重点是SQL,而不是业务对象和ORM.
SQLAlchemy可以使用声明式样式(如Django)为您创建所有内容.如果你想要这个,那么你就是放弃显式编写表定义并明确地搞乱SQL.
Elixir是一种替代方法,可以让您不必查看SQL.
根本问题是"你想看到并触摸SQL吗?"
如果您认为触摸SQL会使事情更"可维护",那么您必须使用显式映射.
如果您认为隐藏SQL会使事情更"可维护",那么您必须使用声明式样式.
如果您认为Elixir可能与SQLAlchemy不同,或者未能以某种方式履行其承诺,那么请不要使用它.
如果您认为Elixir会帮助您,请使用它.
Pav*_*pin 15
在我们的团队中,我们确定了声明性语法.
理由:
metadata
如果需要的话,这是微不足道的:User.metadata
.User
班级,通过子类化Base
,有一个很好的ctor,可以为所有领域提供kwargs.用于测试和其他.例如:user=User(name='doe', password='42')
.所以没必要写一个ctor!关于"从业务角度保持ORM":实际上User
,当" mapper
函数"使用它时,以"正常"方式定义的类会被SA严格修改.恕我直言,声明方式更诚实,因为它尖叫:"这个类在ORM场景中使用,可能不会像对待简单的非ORM对象那样对待".
我发现如果使用sqlalchemy-migrate来版本化数据库模式,那么使用映射器对象比声明性语法简单得多(从我的角度来看,这对于业务应用程序来说是必须的).如果使用映射器对象,则只需将表声明复制/粘贴到迁移版本,并使用简单的api修改数据库中的表.声明性语法使得这更难,因为在将类复制到迁移版本之后,必须从类定义中过滤掉所有辅助函数.
此外,在我看来,使用映射器对象语法可以更清楚地表达表之间的复杂关系,但这可能是主观的.
归档时间: |
|
查看次数: |
7375 次 |
最近记录: |