使用sqlalchemy将数据从multipledict插入多行

时间:2011-08-16 18:11:55

标签: python sqlalchemy pylons pyramid

假设我有一个包含以下列的表:

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',因此数据将被插入到表中的多行中。

感谢。

2 个答案:

答案 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)
...

似乎更清楚但我不知道其他优点/缺点。