Доступ к устаревшей базе данных sqlalchemy 0.6? - PullRequest
0 голосов
/ 18 февраля 2010

Я чувствую, что это должно быть просто, но я не могу найти ни одного примера того, как это делается.

В качестве примера у меня есть следующие существующие таблицы:

CREATE TABLE `source` (
  `source_id` tinyint(3) unsigned NOT NULL auto_increment,
  `name` varchar(40) default NULL,
  PRIMARY KEY  (`source_id`),
  UNIQUE KEY `source_name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

CREATE TABLE `event` (
  `source_id` tinyint(3) unsigned NOT NULL default '0',
  `info` varchar(255) NOT NULL default '',
  `item` varchar(100) NOT NULL default '',
  PRIMARY KEY  (`source_id`,`info`,`item`),
  KEY `event_fkindex1` (`source_id`),
  CONSTRAINT `event_fk1` FOREIGN KEY (`source_id`) REFERENCES `source` (`source_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Я бы хотел использовать sqlalchemy 0.6, чтобы добавить много строк в таблицу событий. Я видел несколько примеров sqlsoup, но действительно ненавижу способ, которым он обращается к БД, постоянно вызывая объект БД. Я проследовал за документами по отражению БД и получил это далеко:

import sqlalchemy
from sqlalchemy import Table, Column, MetaData, create_engine
from sqlalchemy.orm import sessionmaker
engine = create_engine('mysql://user:pass@server/db', echo=True)
metadata = MetaData()
source = Table('source', metadata, autoload=True, autoload_with=engine)
Session = sessionmaker(bind=engine)
session = Session()
session.query(source).first()

Возвращает действительно ужасный объект. Я действительно хочу, чтобы функциональность сопоставления в sqlalchemy ORM позволяла создавать объекты Event для вставки в БД.

Я посмотрел на материал sqlsoup:

from sqlalchemy.ext.sqlsoup import SqlSoup
db = SqlSoup(engine)
db.sources.all() #this kinda works out bet

Но я не мог понять, как добавить объекты из этой точки. Я даже не уверен, что это то, чего я хочу, я хотел бы иметь возможность следовать учебному пособию и материалу Declarative_base. Возможно ли это без необходимости переписывать класс для моделирования всей структуры таблицы? Если нет, может кто-нибудь показать мне, как я это сделаю в этом примере?

Может кто-нибудь указать мне правильный путь, чтобы заставить работать маппер?

1 Ответ

2 голосов
/ 18 февраля 2010

Вы можете использовать предопределенную / автоматически загруженную таблицу с декларативной_базой, присвоив ее атрибуту __table__. Столбцы извлекаются из таблицы, но вам все равно придется объявлять любые отношения, которые вы хотите использовать.

class Source(Base):
    __table__ = source

class Event(Base):
    __table__ = event
    source = relation(Source)

Однако, если вы собираетесь вставлять огромное количество строк, то обход ORM и использование executemany принесут вам значительное увеличение производительности. Вы можете использовать выполнить много, как это:

conn = engine.connect()
conn.execute(event.insert(),[
    {'source_id': 1, 'info': 'xyz', 'item': 'foo'},
    {'source_id': 1, 'info': 'xyz', 'item': 'bar'},
    ...
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...