Другое событие NullPointerException
возникает, когда объявляется массив объектов, а затем сразу же пытается разыменовать его внутри.
String[] phrases = new String[10];
String keyPhrase = "Bird";
for(String phrase : phrases) {
System.out.println(phrase.equals(keyPhrase));
}
Этот конкретный NPE можно избежать, если порядок сравнения отменяется ; а именно, использовать .equals
для гарантированного непустого объекта.
Все элементы внутри массива инициализируются их общим начальным значением ; для любого типа массива объектов, это означает, что все элементы null
.
Вы должны инициализировать элементы в массиве перед доступом или разыменованием их.
String[] phrases = new String[] {"The bird", "A bird", "My bird", "Bird"};
String keyPhrase = "Bird";
for(String phrase : phrases) {
System.out.println(phrase.equals(keyPhrase));
}
SQLAlchemy более полнофункционален и мощен (использует шаблон DataMapper). Django ORM имеет более чистый синтаксис и легче записать для (шаблон ActiveRecord). Я не знаю о различиях в производительности.
SQLAlchemy также имеет декларативный уровень , который скрывает некоторую сложность и дает ей синтаксис ActiveRecord-стиля, более подобный Django ORM.
я не волновался бы о Django, являющемся "слишком тяжелым". Это разъединилось достаточно, что можно использовать ORM, если Вы хотите, не имея необходимость импортировать остальных.
Однако если бы я уже использовал CherryPy для веб-слоя и просто нуждался в ORM, я, вероятно, выбрал бы SQLAlchemy.
Storm имеет возможно самый простой API:
from storm.locals import *
class Foo:
__storm_table__ = 'foos'
id = Int(primary=True)
class Thing:
__storm_table__ = 'things'
id = Int(primary=True)
name = Unicode()
description = Unicode()
foo_id = Int()
foo = Reference(foo_id, Foo.id)
db = create_database('sqlite:')
store = Store(db)
foo = Foo()
store.add(foo)
thing = Thing()
thing.foo = foo
store.add(thing)
store.commit()
И это делает его безболезненным к выпадающему в необработанный SQL, когда Вы должны:
store.execute('UPDATE bars SET bar_name=? WHERE bar_id like ?', [])
store.commit()
Я обычно использую SQLAlchemy. Это довольно мощно и является, вероятно, самым зрелым Python ORM.
, Если Вы - планирование использования CherryPy, Вы могли бы также изучить dejavu, как это Robert Brewer (парень, который является текущим руководителем проекта CherryPy). Я лично не использовал его, но я действительно знаю некоторых людей, которые любят его.
SQLObject немного легче использовать ORM, чем SQLAlchemy, но это не совсем как мощное.
Лично, я не использовал бы Django ORM, если я не был планированием записи всего проекта в Django, но это - просто я.
SQLAlchemy's описание расширение, которое становится стандартным в 0,5, обеспечивает все в одном интерфейсе очень как этот Django или Storm. Это также интегрируется беспрепятственно с классами/таблицами, настроенными с помощью стиля datamapper:
Base = declarative_base()
class Foo(Base):
__tablename__ = 'foos'
id = Column(Integer, primary_key=True)
class Thing(Base):
__tablename__ = 'things'
id = Column(Integer, primary_key=True)
name = Column(Unicode)
description = Column(Unicode)
foo_id = Column(Integer, ForeignKey('foos.id'))
foo = relation(Foo)
engine = create_engine('sqlite://')
Base.metadata.create_all(engine) # issues DDL to create tables
session = sessionmaker(bind=engine)()
foo = Foo()
session.add(foo)
thing = Thing(name='thing1', description='some thing')
thing.foo = foo # also adds Thing to session
session.commit()
Мы используем Elixir вместе с SQLAlchemy и любили его до сих пор. Elixir помещает слой сверху SQLAlchemy, который заставляет ее больше походить на "части счетчика" шаблона ActiveRecord.
Нет никакого мыслимого способа, которым неиспользованные функции в Django дадут потерю производительности. Мог бы просто пригодиться, если Вы когда-нибудь решаете увеличить масштаб проект.
Я проверил бы SQLAlchemy
, Это действительно просто в использовании, и модели, с которыми Вы работаете, не плохи вообще. <забастовка> Django использует SQLAlchemy, поскольку это - ORM забастовка>, но использование его отдельно позволяет Вам использовать, это - полная мощность.
Вот является небольшой пример при создании и выборе orm объектами
>>> ed_user = User('ed', 'Ed Jones', 'edspassword')
>>> session.add(ed_user)
>>> our_user = session.query(User).filter_by(name='ed').first()
>>> our_user
<User('ed','Ed Jones', 'edspassword')>
SQLAlchemy очень, очень мощный. Однако она не является потокобезопасной, поэтому помните об этом при работе с cherrypy в режиме thread-pool.