Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 8, 2008 17:22:52

hildi
От:
Зарегистрирован: 2008-10-07
Сообщения: 66
Репутация: +  0  -
Профиль   Отправить e-mail  

ошибка в sqlobject при генерации классов для своей схемы в postgresql

Ох… Надеюсь, я правильно поняла:


– Table: parameter.bbpop

– DROP TABLE parameter.bbpop;

CREATE TABLE parameter.bbpop
(
id_bbpop serial NOT NULL,
bezeichnung character varying NOT NULL,
region smallint,
plz character varying(5),
ort character varying,
strasse character varying,
hnr character varying,
etage character varying,
raum character varying,
inbetrieb boolean NOT NULL DEFAULT false,
separiert boolean NOT NULL DEFAULT false,
date_created timestamp with time zone,
date_live timestamp with time zone,
CONSTRAINT bbpop_pkey PRIMARY KEY (id_bbpop)
)
WITH (OIDS=FALSE);
ALTER TABLE parameter.bbpop OWNER TO stat_admin;

Это одна таблица, там их штук 8, они объединены в категорию parameter, а база содержит несколько таких категорий.



Офлайн

#2 Окт. 9, 2008 05:27:24

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

ошибка в sqlobject при генерации классов для своей схемы в postgresql

pythonwin
PS TG 1.0.7 не сильно отличается от 1.0.4.4
Посмотри ссылку на баг, которую она дала, он проявляется на постгрессе, на таблицах в схеме отличной от public.



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

Офлайн

#3 Окт. 9, 2008 12:57:45

hildi
От:
Зарегистрирован: 2008-10-07
Сообщения: 66
Репутация: +  0  -
Профиль   Отправить e-mail  

ошибка в sqlobject при генерации классов для своей схемы в postgresql

С SQLAlchemy тоже непонятно :-(

вот это прекрасно генерирует классы из таблиц в интерпретаторе, но при добавлении этого кода в model.py, классы не видны из TG model designer… В model.py надо что-то специально для этого прописывать, чтобы можно было пользоваться TG model designer и Catwalk?

from sqlalchemy import *

engine = create_engine("postgres://...")
meta = MetaData()
meta.reflect(bind = engine, schema = "parameter")
bbpop = Table('parameter.bbpop', meta, autoload = True, autoload_with = engine)
...

class BBPoP(object): pass
...

mapper(BBPoP, bbpop)
...
Я, наверное, ужасно глупые вопросы задаю, но что-то я никак не разберусь, как алхимия взаимодействует с ТГ :-(



Офлайн

#4 Окт. 9, 2008 13:31:53

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

ошибка в sqlobject при генерации классов для своей схемы в postgresql

model designer и Catwalk работают только с sqlobject



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

Офлайн

#5 Окт. 9, 2008 13:33:37

hildi
От:
Зарегистрирован: 2008-10-07
Сообщения: 66
Репутация: +  0  -
Профиль   Отправить e-mail  

ошибка в sqlobject при генерации классов для своей схемы в postgresql

PooH, спасибо большое!



Офлайн

#6 Окт. 10, 2008 06:17:24

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

ошибка в sqlobject при генерации классов для своей схемы в postgresql

hildi
PooH, спасибо большое!
Увы… не за что :(



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

Офлайн

#7 Окт. 10, 2008 06:55:37

pythonwin
От:
Зарегистрирован: 2006-07-18
Сообщения: 1294
Репутация: +  0  -
Профиль   Отправить e-mail  

ошибка в sqlobject при генерации классов для своей схемы в postgresql

sqlobject при создании класса генерирует код sql

        SELECT pg_index.indisprimary,
pg_catalog.pg_get_indexdef(pg_index.indexrelid)
FROM pg_catalog.pg_class c, pg_catalog.pg_class c2,
pg_catalog.pg_index AS pg_index
WHERE c.relname = 'boo.author'
AND c.oid = pg_index.indrelid
AND pg_index.indexrelid = c2.oid
AND pg_index.indisprimary
который ищет в таблице boo.autor id, но который не работает в самом postgres.
нужен аналог этого кода, но для не для public схемы.



Офлайн

#8 Окт. 10, 2008 09:17:21

pythonwin
От:
Зарегистрирован: 2006-07-18
Сообщения: 1294
Репутация: +  0  -
Профиль   Отправить e-mail  

ошибка в sqlobject при генерации классов для своей схемы в postgresql

пока проблему решил так:
в pgconnection.py заменил

    def columnsFromSchema(self, tableName, soClass):

keyQuery = """
SELECT pg_catalog.pg_get_constraintdef(oid) as condef
FROM pg_catalog.pg_constraint r
WHERE r.conrelid = %s::regclass AND r.contype = 'f'"""

colQuery = """
SELECT a.attname,
pg_catalog.format_type(a.atttypid, a.atttypmod), a.attnotnull,
(SELECT substring(d.adsrc for 128) FROM pg_catalog.pg_attrdef d
WHERE d.adrelid=a.attrelid AND d.adnum = a.attnum)
FROM pg_catalog.pg_attribute a
WHERE a.attrelid =%s::regclass
AND a.attnum > 0 AND NOT a.attisdropped
ORDER BY a.attnum"""

primaryKeyQuery = """
SELECT pg_index.indisprimary,
pg_catalog.pg_get_indexdef(pg_index.indexrelid)
FROM pg_catalog.pg_class c, pg_catalog.pg_class c2,
pg_catalog.pg_index AS pg_index
WHERE c.relname = %s
AND c.oid = pg_index.indrelid
AND pg_index.indexrelid = c2.oid
AND pg_index.indisprimary
"""
primaryKeyQueryMySchema = """
SELECT
pg_index.indisprimary,
pg_indexes.indexdef
FROM pg_catalog.pg_class c, pg_catalog.pg_class c2, pg_catalog.pg_index AS pg_index, pg_indexes
WHERE c.relname = '%(tableNameOnly)s'
AND c.oid = pg_index.indrelid
AND pg_index.indexrelid = c2.oid
AND pg_index.indisprimary
AND pg_indexes.tablename = '%(tableNameOnly)s'
AND pg_indexes.schemaname = '%(schemaname)s'
AND pg_catalog.pg_get_indexdef(pg_index.indexrelid) = pg_indexes.indexdef;
"""

keyData = self.queryAll(keyQuery % self.sqlrepr(tableName))
keyRE = re.compile(r"\((.+)\) REFERENCES (.+)\(")
keymap = {}

for (condef,) in keyData:
match = keyRE.search(condef)
if match:
field, reftable = match.groups()
keymap[field] = reftable.capitalize()

if '.' in tableName:
schemaname, tableNameOnly = tableName.split('.')
else:
schemaname, tableNameOnly = 'public', tableName
sql = primaryKeyQueryMySchema%{'schemaname':schemaname, 'tableNameOnly':tableNameOnly}
#primaryData = self.queryAll(primaryKeyQuery % self.sqlrepr(tableName))
primaryData = self.queryAll(sql)
primaryRE = re.compile(r'CREATE .*? USING .* \((.+?)\)')
primaryKey = None
for isPrimary, indexDef in primaryData:
match = primaryRE.search(indexDef)
assert match, "Unparseable contraint definition: %r" % indexDef
assert primaryKey is None, "Already found primary key (%r), then found: %r" % (primaryKey, indexDef)
primaryKey = match.group(1)
assert primaryKey, "No primary key found in table %r" % tableName
if primaryKey.startswith('"'):
assert primaryKey.endswith('"')
primaryKey = primaryKey[1:-1]

colData = self.queryAll(colQuery % self.sqlrepr(tableName))
results = []
if self.unicodeCols:
client_encoding = self.queryOne("SHOW client_encoding")[0]
for field, t, notnull, defaultstr in colData:
if field == primaryKey:
continue
colClass, kw = self.guessClass(t)
if self.unicodeCols and colClass is col.StringCol:
colClass = col.UnicodeCol
kw['dbEncoding'] = client_encoding
kw['name'] = soClass.sqlmeta.style.dbColumnToPythonAttr(field)
kw['dbName'] = field
kw['notNone'] = notnull
if defaultstr is not None:
kw['default'] = self.defaultFromSchema(colClass, defaultstr)
elif not notnull:
kw['default'] = None
if keymap.has_key(field):
kw['foreignKey'] = keymap[field]
results.append(colClass(**kw))
return results
после этого заработало
>>> import sqlobject
>>> from sqlobject import *
>>> connection_string = “postgres://postgres@localhost/t1”
>>> connection = sqlobject.connectionForURI(connection_string)
>>> sqlobject.sqlhub.processConnection = connection
>>> hub = connection.transaction()
>>> class Author(SQLObject):
… class sqlmeta:
… table = ‘boo.author’
… fromDatabase = True

>>> class Author1(SQLObject):
… class sqlmeta:
… table = ‘author’
… fromDatabase = True

>>> Author.sqlmeta.columns
{'login': <SOStringCol login not null>, ‘password’: <SOStringCol password not null>, ‘name’: <SOStringCol name not null>}
>>> Author(login='login', password='password', name='name')
<Author 1L login='login' password='password' name='name'>
>>> Author.select()
<SelectResults at -4883e954>
>>> Author.select()
<SelectResults at -4883ea14>
>>> Author.select()
<SelectResults at -4883e954>
>>> Author.select()
<SelectResults at -4883e874>
>>> print Author.select()
SELECT boo.author.id, boo.author.login, boo.author.password, boo.author.name FROM boo.author WHERE 1 = 1 LIMIT 5
>>> l = list(Author.select())
>>> l

>>> Author1(login='login', password='password', name='name')
<Author1 1L login='login' password='password' name='name'>
>>> list(Author1.select())
PS SQLObject-0.8.2-py2.4.egg, debian lenny
через catwalk тоже работатет



Офлайн

#9 Окт. 10, 2008 09:26:59

pythonwin
От:
Зарегистрирован: 2006-07-18
Сообщения: 1294
Репутация: +  0  -
Профиль   Отправить e-mail  

ошибка в sqlobject при генерации классов для своей схемы в postgresql

hildi, для твоей таблицы это будет выглядеть так

class BBPoP(SQLObject):
class sqlmeta:
fromDatabase = True
table = 'boo.bbpop'
idName = 'id_bbpop'



Офлайн

#10 Окт. 10, 2008 13:39:59

hildi
От:
Зарегистрирован: 2008-10-07
Сообщения: 66
Репутация: +  0  -
Профиль   Отправить e-mail  

ошибка в sqlobject при генерации классов для своей схемы в postgresql

Спасибо, pythonwin!
Правда, тулбокс хоть на скрипт и не ругается, но ничего и не отображает :-)
Фиг с ним, я уже SQLAlchemy добилась нужного результата и застряла на следующем действии :-)

апд: сорри, все работает, миллион спасибо!



Отредактировано (Окт. 10, 2008 13:41:49)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version