Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 4, 2008 10:03:33

PROeXT
От:
Зарегистрирован: 2008-06-05
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

sqlalchemy связь таблиц

Всем привет. Почитал мануал, попробовал, ничего не получается…
Есть две таблицы.

users (
id Integer, primary-key, auto-inc
fio string 150
region_id integer
)

regions(
id integer primary-key, auto-inc,
val string 100
)
Как я не пытался связать их между собой - все не выходит :( HELP



Офлайн

#2 Авг. 4, 2008 10:30:43

PROeXT
От:
Зарегистрирован: 2008-06-05
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

sqlalchemy связь таблиц

Все, спасибо. Сам разобрался.



Офлайн

#3 Авг. 4, 2008 16:43:53

BION
От:
Зарегистрирован: 2007-08-26
Сообщения: 62
Репутация: +  0  -
Профиль   Отправить e-mail  

sqlalchemy связь таблиц

PROeXT
Ну раз уж разобрался, так запости, так сказать для потомков :)



Офлайн

#4 Авг. 4, 2008 17:17:31

PROeXT
От:
Зарегистрирован: 2008-06-05
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

sqlalchemy связь таблиц

BION
PROeXT
Ну раз уж разобрался, так запости, так сказать для потомков :)
Ну что ж. Для потомков - это святое. Выкладываю пример полного листинга:

# -*-coding: utf-8; show-trailing-whitespace: t -*-

import sqlite3
from sqlalchemy import Table, ForeignKey, Unicode, Integer, create_engine, MetaData, Column
from sqlalchemy.orm import mapper, sessionmaker, scoped_session, relation

engine = create_engine("sqlite:///memory")
Session = scoped_session(sessionmaker(autoflush=True, transactional=True, bind=engine))
session = Session()
metadata = MetaData(bind=engine)



tbl_regions = Table("regions", metadata,
Column("id", Integer, primary_key=True),
Column("reg_name", Unicode(100)))

tbl_person = Table("persons", metadata,
Column("id", Integer, primary_key=True),
Column("fio", Unicode(150)),
Column("region_id", Integer, ForeignKey("regions.id")))

class Person(object):
def __init__(self, fio=u""):
self.fio = fio

def repr(self):
return "<Person(id:{%d}, fio:{%s})>" % (self.id, self.fio)

class Region(object):
def __init__(self, reg_name=u""):
self.reg_name = reg_name

def repr(self):
return "<Region(id:{%d}, reg_name:{%s})>" % (self.id, self.reg_name)

mapper(Region, tbl_regions)
mapper(Person, tbl_person,
properties={"regions": relation(Region, uselist=True)})


############################################################################
# #
# Testing block #
# #
############################################################################

import unittest

class TestApp(unittest.TestCase):
def setUp(self):
metadata.create_all()
def tearDown(self):
metadata.drop_all()

def test_main(self):
person = Person(u"Test fio")
person.regions.append(Region(u"This is the test region"))
session.save(person)
session.commit()
self.assertEqual(person.regions[0].reg_name, u"This is the test region")

if __name__ == "__main__":
unittest.main()



Офлайн

#5 Авг. 4, 2008 17:18:31

Ferroman
От:
Зарегистрирован: 2006-11-16
Сообщения: 2759
Репутация: +  1  -
Профиль   Отправить e-mail  

sqlalchemy связь таблиц

Был бы рейтинг - поставил бы + за юнитесты.

Офлайн

#6 Авг. 4, 2008 17:20:31

PROeXT
От:
Зарегистрирован: 2008-06-05
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

sqlalchemy связь таблиц

Ferroman
Был бы рейтинг - поставил бы + за юнитесты.
:)



Офлайн

#7 Янв. 21, 2011 04:48:39

m.meehalkoff
От:
Зарегистрирован: 2011-01-21
Сообщения: 25
Репутация: +  0  -
Профиль   Отправить e-mail  

sqlalchemy связь таблиц

PROeXT
Ну что ж. Для потомков - это святое. Выкладываю пример полного листинга:
Хочется прокомментировать этот код :)

PROeXT
import sqlite3
Для чего импортирован этот модуль? Вы его где то используете в программе?

PROeXT
engine = create_engine("sqlite:///memory")
В результате выполнения этой строки получается файл ‘memory’, а Вы видимо хотели использовать базу в оперативной памяти, не создавая файл. Следует исправить на (“sqlite:///:memory:”)

PROeXT
Session = scoped_session(sessionmaker(autoflush=True, transactional=True, bind=engine))
autoflush = True по умолчанию
transactional=True Нет такого параметра и использование его приводит к ошибке.

PROeXT
def test_main(self):
#…
session.save(person)
К сожалению нет такого метода и в итоге ошибка.

Вывод:
Код не работает. Хотя с вопросом связывания таблиц Вы разобрались))



Отредактировано (Янв. 21, 2011 04:50:16)

Офлайн

#8 Янв. 21, 2011 07:08:01

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

sqlalchemy связь таблиц

m.meehalkoff
Вывод:
Код не работает. Хотя с вопросом связывания таблиц Вы разобрались))
А вы не подумали что версии алхимии у вас и топикстартера могут отличаться?



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version