假设我有一个包含以下列的表:
id, title, description
我有一个包含多个具有相同名称的输入字段的表单。 E.g:
<input type='text' name='title' value = 'A title' />
<input type='text' name='title' value = 'Another title' /> etc...
我从POST请求中获得以下multidict。
([('title', 'A title'), ('description', 'A description'),
('title', 'Another title'), ('description', 'Another description'),
('title', 'One more title'), ('description', 'One more description')])
我的问题是,从上面的数据中我将如何从上面的multidict中分离每一行数据并使用SQLAlchemy执行'INSERT INTO',因此数据将被插入到表中的多行中。
感谢。
答案 0 :(得分:2)
以下(自包含的工作样本)代码应该给你一个想法:
from sqlalchemy import create_engine, Table, Column, Integer, String, MetaData
from sqlalchemy.orm import mapper, sessionmaker
engine = create_engine('sqlite:///:memory:', echo=True,)
metadata = MetaData()
mytable = Table('mytable', metadata,
Column('id', Integer, primary_key=True),
Column('title', String(50)),
Column('description', String(50)),
)
class MyObject(object):
# 1. define keywork based constructor (or do this in the part 2.)
def __init__(self, **kwargs):
for k, v in kwargs.items():
setattr(self, k, v)
mapper(MyObject, mytable)
metadata.create_all(engine)
session = sessionmaker(bind=engine, autoflush=False)()
input = ([('title', 'A title'), ('description', 'A description'),
('title', 'Another title'), ('description', 'Another description'),
('title', 'One more title'), ('description', 'One more description')])
# 2. add data to the session, then commit
while input:
values = dict((input.pop(0), input.pop(0)))
obj = MyObject(**values)
session.add(obj)
session.commit()
答案 1 :(得分:1)
我使用multidict.getall()
和zip
在我的代码中实现了相同的目标:
...
input = ([('title', 'A title'), ('description', 'A description'),
('title', 'Another title'), ('description', 'Another description'),
('title', 'One more title'), ('description', 'One more description')])
titles = input.getall('title')
descriptions = input.getall('description')
for title, description in zip(titles, descriptions):
obj = MyObject(title, description)
session.add(obj)
...
似乎更清楚但我不知道其他优点/缺点。