Вы также запрашиваете mongoose, что неверно, поскольку в качестве запроса он принимает первый аргумент:
app.post('/tweet',(req,res)=>{
tweetData.find(queryObject || {}, (err,data)=>{
if(err){
return res.json({success: false, error: err});
}
return res.json({success: true, data:data});
});
})
Вы регистрируете состояние сразу после того, как вы ' обновляя его, позвольте мне сказать вам, что это не так, оно не сразу обновляет состояние, поэтому вам придется подождать, пока это произойдет.
Вы можете передать обратный вызов на setState
, чтобы он выполнял обратный вызов после завершения изменения состояния, что-то вроде этого:
this.setState({ data: result.data }, () => {
console.log(this.state)
})
Что ж, есть одна вещь, которую вам не хватает: упомянутый вами учебник не «строит» полный пример, разные фрагменты кода не предназначены для объединения в один исходный файл. Скорее, они описывают различные способы использования библиотеки. Не нужно пытаться делать одно и то же снова и снова самостоятельно.
Если не брать в расчет часть фактического использования ормы в вашем примере, код может выглядеть следующим образом:
from sqlalchemy import *
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, scoped_session
engine = create_engine('sqlite:///:memory:', echo=True)
Base = declarative_base(bind=engine)
Session = scoped_session(sessionmaker(engine))
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String)
fullname = Column(String)
password = Column(String)
Base.metadata.create_all()
"Декларативное" расширение заботится о определения таблицы и сопоставления ее с вашим классом, поэтому вам не нужно самостоятельно объявлять users_table
. Класс User также позволяет создавать экземпляры с ключевыми аргументами, такими как User (name = "foo")
(но не позиционными аргументами).
Я также добавил использование scoped_session, что означает, что вы можете напрямую использовать Session
, фактически не создавая его (он создаст экземпляр нового сеанса, если он еще не присутствует в текущем потоке, или повторно использовать существующий в противном случае)
Что ж, SQLAlchemy разделена на разные части, основная часть ядра просто обрабатывает БД, преобразуя ваши запросы, построенные на Python, в соответствующий язык SQL для базовой БД. Кроме того, есть поддержка сеансов, орма и нового декларативного синтаксиса.
Похоже, SQLObject (я не могу точно сказать, не использовал его много лет, да и то только один раз) пропускает большую часть этого и сразу делает часть ORM. Это часто упрощает работу с простыми данными (что в большинстве случаев может сойти с рук), но SQLAlchemy позволяет создавать более сложные макеты базы данных и, если вам это действительно нужно, приступить к работе с базой данных.
вы говорите «запутанный» .... кто-то другой может сказать «гибкий». Иногда вам это нужно, иногда нет. Разве не здорово, что у тебя есть выбор?
Воспользовавшись SQLObject (и прочитав только о SQLAlchemy), я могу сказать, что одна из сильных сторон SQLObject - это легкость и простота, с которой вы можете выполнять работу. Кроме того, отличную поддержку оказывает группа электронной почты ( https://lists.sourceforge.net/lists/listinfo/sqlobject-discuss ), которая довольно быстро возвращает вам ответы.
Приведенные вами примеры кода не являются точными. Версия SQLAlchemy может быть немного урезана:
from sqlalchemy import create_engine
from sqlalchemy import Table, Column, Integer, String, MetaData, ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
engine = create_engine('sqlite:///:memory:', echo=True)
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column('id', Integer, primary_key=True)
name = Column('name', String)
fullname = Column('fullname', String)
password = Column('password', String)
def __repr__(self):
return "" % (self.name, self.fullname, self.password)
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session = Session()
# actually using the ORM isn't too bad..
ed_user = User(name='ed', fullname='Ed Jones', password='edspassword')
session.add(ed_user)
our_user = session.query(User).filter_by(name='ed').first()
session.add_all([
User(name='wendy', fullname='Wendy Williams', password='foobar'),
User(name='mary', fullname='Mary Contrary', password='xxg527'),
User(name='fred', fullname='Fred Flinstone', password='blah')])
ed_user.password = 'f8s7ccs'
session.flush()
for instance in session.query(User).order_by(User.id):
print instance.name, instance.fullname
for name, fullname in session.query(User.name, User.fullname):
print name, fullname
Вы также можете найти Elixir , больше похожий на SQLObject (но поскольку я не использовал ни того, ни другого, это всего лишь предположение).
SQLObject не использовался). вообще, я не могу комментировать, что именно SA делает лучше. Но у меня был большой опыт работы с SA, особенно когда я имел дело со сложными, реальными, устаревшими схемами. Он отлично справляется с созданием хороших SQL-запросов по умолчанию и имеет множество способов их настройки.
Я обнаружил, что авторский элеваторный шаг автора SQLAlchemy довольно хорошо работает на практике.