使用Marshmallow时,有没有办法避免将数据插入到会话中 - sqlalchemy
sqlalchemy marshmallow避免加载到会话中
参考:https://marshmallow-sqlalchemy.readthedocs.org/en/latest/
因为我们试图通过自己管理对象。如果需要,将添加到会话中,但是对于验证,我需要使用load()
author = Author(name='Chuck Paluhniuk')
book = Book(title='Fight Club', author=author)
session.add(author)
session.add(book)
session.commit()
author_schema.dump(author).data
# {'books': [123], 'id': 321, 'name': 'Chuck Paluhniuk'}
author_schema.load(dump_data, session=session).data
# <Author(name='Chuck Paluhniuk')>
为了避免这个问题,在我尝试加载后,我可以调用DB Session.close()
来忽略临时数据。但同样我需要让会话将数据刷新到DB中。
请指教。谢谢你的帮助
答案 0 :(得分:0)
将对象添加到session
对代码有无不良影响。正如你所说,你将在以后自己做。因此,手动添加或通过load
方法添加它没有区别。
author = author_schema.load(dump_data, session=session)
# now author has been added to session by load method
# do whatever you want
db.session.commit() # This is enough to write changes you've made
# or if you don't want to save anything just
db.session.rollback()
我真的不明白你为什么要阻止通过load
的方法将对象添加到会话中
答案 1 :(得分:-1)
对架构>>> from models import session
>>> from schema import author_schema
>>> a = {'id': 1, 'name': 'Chuck Paluhniuk'}
>>> obj = author_schema.load(a, session=session)
>>> session.new
IdentitySet([])
>>> session.add(obj.data)
>>> session.new
IdentitySet([<Author(name=u'Chuck Paluhniuk')>])
>>> session.commit()
>>> session.new
IdentitySet([])
>>> session.identity_map.items()
[((<class 'models.Author'>, (1,)), <Author(name=u'Chuck Paluhniuk')>)]
>>> session.dirty
IdentitySet([])
的调用并不会自动将对象添加到会话中:
session.dirty
对象必须以另一种方式进入会话。也许您可以发布一些展示此问题的代码?
更新:我将load()
的输出添加到我的示例代码中。如你所见,它是空的。我不理解投票结果。声明是private void btnSent_Click(object sender, EventArgs e)
{
try
{
MailMessage mail = new MailMessage();
SmtpClient SmtpServer = new SmtpClient("smtp.gmail.com");
mail.From = new MailAddress(txtAcc.Text);
mail.To.Add(txtToAdd.Text);
mail.Subject = txtSub.Text;
mail.Body = txtContent.Text;
System.Net.Mail.Attachment attachment;
attachment = new System.Net.Mail.Attachment(txtAttachment.Text);
mail.Attachments.Add(attachment);
SmtpServer.Port = 587;
SmtpServer.Credentials = new System.Net.NetworkCredential(txtAcc.Text, txtPassword.Text);
SmtpServer.EnableSsl = true;
SmtpServer.Send(mail);
MessageBox.Show("mail send");
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
private void button1_Click(object sender, EventArgs e)
{
MailMessage mail = new MailMessage();
openFileDialog1.ShowDialog();
System.Net.Mail.Attachment attachment;
attachment = new System.Net.Mail.Attachment(openFileDialog1.FileName);
mail.Attachments.Add(attachment);
txtAttachment.Text =Convert.ToString (openFileDialog1.FileName);
}
更改了会话,但它并没有。其他一些代码也可以。您能提供一个显示您的方案的代码示例吗?