Вставка данных из multipledict в несколько строк с использованием sqlalchemy - PullRequest
0 голосов
/ 16 августа 2011

Предполагается, что у меня есть таблица со следующими столбцами:

id, title, description

У меня есть форма с несколькими полями ввода с одинаковыми именами. E.g.:

<input type='text' name='title' value = 'A title' />
<input type='text' name='title' value = 'Another title' /> etc...

Я получаю следующий мультидикт из запроса POST.

([('title', 'A title'), ('description', 'A description'), 
('title', 'Another title'), ('description', 'Another description'), 
('title', 'One more title'), ('description', 'One more description')])

Мой вопрос заключается в том, как из вышеприведенных данных я бы отделил каждую строку данных от мультидикта выше и сделал бы INSERT INTO, используя SQLAlchemy, чтобы данные вставлялись в несколько строк в таблице.

Спасибо.

Ответы [ 2 ]

2 голосов
/ 17 августа 2011

Следующий (автономный рабочий пример) код должен дать вам идею:

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 голос
/ 27 августа 2012

Я использую 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)
...

Кажется, это немного яснее, но я не знаю о других преимуществах / недостатках.

...