python 2.5, SA 4.3, база на Firebird через kinterbasdb
Здравствуйте. Насколько я понял из английской доки, при использовании SQLAlchemy существует возможность не моделировать структуру таблиц, а считать ее при наличии готовой базы. Но вот только не понял, как...
python 2.5, SA 4.3, база на Firebird через kinterbasdb
python 2.5, SA 4.3, база на Firebird через kinterbasdb
Попробовал следующим образом:
В файле development.ini описываем строку подключения к firebird:
в файле /model/__init__.py содержится следующее:
В файле /model.meta.py - следующее:
WindowsXP, SA 0.4.6, Python 2.5.2 - дома & Windows 2003 Server, SA 0.4.5, Python 2.5.2 - на сервере, где и планируется.
В файле development.ini описываем строку подключения к firebird:
sqlalchemy.dburi="firebird://SYSDBA:masterkey@localhost:3050/d:/ifield7/ifield7.fdb"(Правильно? firebird в документации SQLAlchemy обойден незаслуженно, поэтому я сомневаюсь)в файле /model/__init__.py содержится следующее:
__all__=["model"]
import sqlalchemy as sa
from sqlalchemy import orm
import meta
import records #ВОТ КСТАТИ, А ОТКУДА ЭТО И ЧТО В НЕМ ДОЛЖНО БЫТЬ??? Компилятор ругается, что
#этого модуля нет, создал пустой. Но что-то же в нем должно быть?
def init_model(engine):
"""Call me before using any of the tables or classes in the model."""
sm = orm.sessionmaker(autoflush=True, transactional=True, bind=engine)
meta.engine = engine
meta.Session = orm.scoped_session(sm)
records.t_insured = sa.Table("INSURED", meta.metadata, autoload=True, autoload_with=engine)
orm.mapper(records.Record, records.t_insured) #Я так понимаю, t_insured - это какое-то
#описание моей таблицы INSURED? Но ведь
#уговор был, что SA сама считывает структуру?(Это я вынес из статьи "Using SQLAlchemy with pylons")В файле /model.meta.py - следующее:
"""SQLAlchemy Metadata and Session object"""
from sqlalchemy import MetaData
__all__ = ['engine', 'metadata', 'Session']
# SQLAlchemy database engine. Updated by model.init_model().
engine = None
# SQLAlchemy session manager. Updated by model.init_model().
Session = None
# Global metadata. If you have multiple databases with overlapping table
# names, you'll need a metadata for each database.
metadata = MetaData()Так вот: я не понимаю: как оно должно считать структуру готовой БД? В какой-то файл (сгенерировать его) или просто создать модель "в голове" на время сессии?WindowsXP, SA 0.4.6, Python 2.5.2 - дома & Windows 2003 Server, SA 0.4.5, Python 2.5.2 - на сервере, где и планируется.
(Это я вынес из статьи "Using SQLAlchemy with pylons")Прочитайте просто tutorial про sqlalchemy: там две штуки - про orm и про sqlalchem expression language.
Прочитайте несколько раз и то и другое, а потом ещё ссылку, которую я давал выше на reflecting.
Дак я прочел же это все, и оф. доку к 0,4 тоже, и рефлектинг тэйбл, кстати, я его и раньше тоже читал, потому и задал такой вопрос, что это было непонятно! :с( И все, что наскреб на блогах... Вот и пытаюсь... Сама философия непонятна. Import meta - понятно, там пустые задачи. Будет updated by model.init_model()
А records - про это нигде не было сказано... Причем from model import records. А кто-то же должен этот модуль в пакет model положить, я так понимаю. Или я смотрю в книгу - вижу фигу?
А records - про это нигде не было сказано... Причем from model import records. А кто-то же должен этот модуль в пакет model положить, я так понимаю. Или я смотрю в книгу - вижу фигу?
Я не знаком с архитекуторой pylons, что касается вышеприведённого кода, то
records.t_insured = sa.Table("INSURED", meta.metadata, autoload=True, autoload_with=engine)
orm.mapper(records.Record, records.t_insured) #Я так понимаю, t_insured - это какое-то
#описание моей таблицы INSURED? Но ведь
#уговор был, что SA сама считывает структуру?records - это видимо какое-то хранилище таблиц и вы в него вставляет *автоматически созданную* таблицу t_insured. По-моему, всё логично ) Вы считали структуру таблицы, просто сохранили её не в переменную, а в аттрибут объекта.
records - это видимо какое-то хранилище таблиц и вы в него вставляет *автоматически созданную* таблицу t_insuredТо-есть, Вы хотите сказать, что я должен создать в директории model пустой файл records, и при обращении к файлу model.__init__.py он будет заполнен моделью базы данных сам? Что-то странно... хм. Ну попробую сегодня
Что за упрямство, на кой вам сдался этот records? ) Это какая-то особенность alchemy, не более.
По ссылке что я давал есть примеры кода, в самом первом пример мы видим:
По ссылке что я давал есть примеры кода, в самом первом пример мы видим:
messages = Table('messages', meta, autoload=True)Этого достаточно, чтобы автоматически создать объект.
Добрый день. Продолжаю парить Pylons+SA
В доке для SA сказано
Put this at the top of myapp/config/environment.py:
And this in the load_environment function:
The second argument is the prefix to look for. If you named your keys "sqlalchemy.default.url", you would put "sqlalchemy.default." here. The prefix may be anything, as long as it's consistent between the config file and this function call.
У меня в development.ini строка подключения следующая:
Но... пастер после этого не запускается. Если запустить без автозакрытия ком. строки - видно, что ему не нравится это самое sqlalchemy.dburi
Перестал понимать :с(
Есть где-нибудь возможность скачать работающий пример Pylons с SA? Можно и с другой базой, не обяз. с FireBird
В доке для SA сказано
Put this at the top of myapp/config/environment.py:
from sqlalchemy import engine_from_config
from myapp.model import init_model- делаем это, сохраняем, пастер перезапускается, нормально.And this in the load_environment function:
engine = engine_from_config(config, 'sqlalchemy.')
init_model(engine)- добавляем, как и написано. Теперь упомянутая функция выглядит так:def load_environment(global_conf, app_conf):
"""Configure the Pylons environment via the ``pylons.config``
object
"""
# Pylons paths
root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
paths = dict(root=root,
controllers=os.path.join(root, 'controllers'),
static_files=os.path.join(root, 'public'),
templates=[os.path.join(root, 'templates')])
# Initialize config with the basic options
config.init_app(global_conf, app_conf, package='firstapp',
template_engine='mako', paths=paths)
config['routes.map'] = make_map()
config['pylons.g'] = app_globals.Globals()
config['pylons.h'] = firstapp.lib.helpers
# Customize templating options via this variable
tmpl_options = config['buffet.template_options']
engine = engine_from_config(config, 'sqlalchemy.dburi')
init_model(engine)... И пастер со свистом вылетает. Понятно, что не нравятся 2 крайние строки. В доках сказано:The second argument is the prefix to look for. If you named your keys "sqlalchemy.default.url", you would put "sqlalchemy.default." here. The prefix may be anything, as long as it's consistent between the config file and this function call.
У меня в development.ini строка подключения следующая:
sqlalchemy.dburi="firebird://SYSDBA:masterkey@localhost:3050/d:/ifield7/ifield7.fdb", вот оттуда я и взял этот "second argument": sqlalchemy.dburi Но... пастер после этого не запускается. Если запустить без автозакрытия ком. строки - видно, что ему не нравится это самое sqlalchemy.dburi
Перестал понимать :с(
Есть где-нибудь возможность скачать работающий пример Pylons с SA? Можно и с другой базой, не обяз. с FireBird
Что конкретно написано в ошибке?
If you named your keys "sqlalchemy.default.url", you would put "sqlalchemy.default."Может быть у вас должно быть написано sqlalchemy.dburi.url в конфиге?