python - 使用字典对 sqlalchemy 进行广义插入

标签 python dictionary flask sqlalchemy

我正在 Flask 中构建一个应用程序,并且定义了多个 SQLAlchemy 模型。我有一个包含每种模型类型的键/值对的字典。

我想要一个使用字典的通用插入...这需要映射器吗?我知道 wtforms.ext.sqlalchemy.orm.model_form() 生成一个带有 populate_obj(model) 的对象,所以这是可能的。我已经梳理了文档但找不到它。我可以稍后执行提交,但现在需要一个快捷方式来填充对象。请问,有没有人有专业知识?

from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy

app = Flask(__name__)
db = SQLAlchemy()
db.init_app(app)

employee_data = {'firstname':'John','lastname':'Smith'}
project_data = {'name':'project1'}

dict_generalised_insert(model=Employee,dictionary=employee_data)
dict_generalised_insert(model=Project,dictionary=project_data)

def dict_generalised_insert(model=None,dictionary={})
    obj = model.model() 
    obj.populate_obj(dictionary) # ???
    return obj

class Employee(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    firstname = db.Column(db.String(80))
    lastname = db.Column(db.String(80))

class Project(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(80))

最佳答案

解压字典的惯用方法是使用双星运算符**

将它与 flask-sqlalchemy 一起使用:

class Employee(db.Model)
    id = db.Column(...)
    firstname = db.Column(...)
    lastname = db.Column(...)

employee_data = {'firstname':'John','lastname':'Smith'}
employee = Employee(**employee_data)
db.session.add(employee)
db.session.commit()

请注意,字典中的键必须与类的属性名称相匹配。以这种方式解包与:

employee = Employee(firstname='John', lastname='Smith')

如果您定义一个带有位置参数的 __init__(或其他方法),您也可以使用列表来执行此操作,但是您只使用一个星号:

def __init__(self, firstname, lastname):
    self.firstname = firstname
    self.lastname = lastname

employee_data = ['John', 'Smith']
employee = Employee(*employee_data)
...

请注意,值的顺序很重要。

关于python - 使用字典对 sqlalchemy 进行广义插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31750441/

相关文章:

Java:如何使用 HashMap 的一对键

python - 如何从 Python 中的 json 文件中获取字典?

javascript - AngularJS:页面加载时使用服务器数据更改输入值

python,从列表中删除字符串中的单词

scala - scala中的奇怪类型推断

python - 将请求路由到特定的 uwsgi 工作线程

mysql - 从请求数据中生成 XML 代码并插入到数据库中

python - Caffe - draw_net_to_file - 'Classifier' 对象没有属性 'name'

python - 如何在不编写类的情况下访问 Tkinter 中按钮的父级?

python - 指定尺寸时,torch.max 使用 GPU 比使用 CPU 慢