FastNetMon

Sunday, 18 October 2009

Pylons: подключение базы данных

Теперь подключаем базу данных к Pylons.

Ставить все будем либо на Постгресе - http://phpsuxx.blogspot.com/2010/03/postgresql-8-centos-debian-5.html либо на MySQL (http://phpsuxx.blogspot.com/2009/12/mysql-debian5-lenny.html). От типа БД зависит только sqlalchemy.url и все.

Модуль для работы с PostgreSQL из Python:
apt-get install python-psycopg2


Модуль для работы с MySQL из Python
apt-get install -y python-mysqldb


Теперь указываем урл до бд в файле
vi development.ini


PostgreSQL:
sqlalchemy.url = postgres://my_db_user:qwerty@127.0.0.1:5432/my_test_database


MySQL:

sqlalchemy.url = mysql://my_db_user:qwerty@127.0.0.1/my_test_database


В самый верх файла (блок импорта) myapp/model/__init__.py добавляем:

import sqlalchemy as sa
from sqlalchemy import orm


А в самый его же низ (без отступов вообще!):

t_persons = sa.Table("persons", meta.metadata,
sa.Column("id", sa.types.Integer, primary_key=True),
sa.Column("name", sa.types.String(100), primary_key=True),
sa.Column("email", sa.types.String(100)),
)

class Person(object):
pass

orm.mapper(Person, t_persons)



Инициализируем БД (при этом из описанной нами схемы будет сгенерирован sql код для конкретной бд, в нашем случае это Постгрес):
paster setup-app development.ini


В ответ будет выдано примерно следующее:

Running setup_config() from servermon.websetup
23:50:21,962 INFO [sqlalchemy.engine.base.Engine.0x...5c10] [MainThread] SELECT DATABASE()
23:50:21,963 INFO [sqlalchemy.engine.base.Engine.0x...5c10] [MainThread] ()
23:50:21,964 INFO [sqlalchemy.engine.base.Engine.0x...5c10] [MainThread] SHOW VARIABLES LIKE 'character_set%%'
23:50:21,964 INFO [sqlalchemy.engine.base.Engine.0x...5c10] [MainThread] ()
23:50:21,964 INFO [sqlalchemy.engine.base.Engine.0x...5c10] [MainThread] SHOW VARIABLES LIKE 'lower_case_table_names'
23:50:21,964 INFO [sqlalchemy.engine.base.Engine.0x...5c10] [MainThread] ()
23:50:21,965 INFO [sqlalchemy.engine.base.Engine.0x...5c10] [MainThread] SHOW COLLATION
23:50:21,965 INFO [sqlalchemy.engine.base.Engine.0x...5c10] [MainThread] ()
23:50:21,967 INFO [sqlalchemy.engine.base.Engine.0x...5c10] [MainThread] SHOW VARIABLES LIKE 'sql_mode'
23:50:21,968 INFO [sqlalchemy.engine.base.Engine.0x...5c10] [MainThread] ()
23:50:21,968 INFO [sqlalchemy.engine.base.Engine.0x...5c10] [MainThread] DESCRIBE `persons`
23:50:21,968 INFO [sqlalchemy.engine.base.Engine.0x...5c10] [MainThread] ()
23:50:21,969 INFO [sqlalchemy.engine.base.Engine.0x...5c10] [MainThread] ROLLBACK
23:50:21,969 INFO [sqlalchemy.engine.base.Engine.0x...5c10] [MainThread]
CREATE TABLE persons (
id INTEGER NOT NULL AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
email VARCHAR(100),
PRIMARY KEY (id, name)
)

23:50:21,969 INFO [sqlalchemy.engine.base.Engine.0x...5c10] [MainThread] ()
23:50:22,069 INFO [sqlalchemy.engine.base.Engine.0x...5c10] [MainThread] COMMIT


В самой же базе данных это принимает вид:

CREATE TABLE `persons` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(100) NOT NULL,
`email` varchar(100) default NULL,
PRIMARY KEY (`id`,`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8


Кстати, хотелось бы напомнить, что если после деплоя схемы в базу вы ей измените и повторно запустите setup-app, то новые поля добавлены не будут. Как это побороть, я пока не понял.

Более полная документация: http://www.sqlalchemy.org/docs/ и http://pylonshq.com/docs/en/0.9.7/models/#working-with-sqlalchemy

No comments :

Post a Comment

Note: only a member of this blog may post a comment.