使用marshmallow sql-alchemy对象时避免使用DB Session添加marshmallow对象

时间:2016-04-11 14:18:25

标签: python flask sqlalchemy flask-sqlalchemy marshmallow

使用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中。

请指教。谢谢你的帮助

2 个答案:

答案 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); } 更改了会话,但它并没有。其他一些代码也可以。您能提供一个显示您的方案的代码示例吗?