Форум сайта python.su
Ох… Надеюсь, я правильно поняла:
– 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, а база содержит несколько таких категорий.
Офлайн
pythonwinПосмотри ссылку на баг, которую она дала, он проявляется на постгрессе, на таблицах в схеме отличной от public.
PS TG 1.0.7 не сильно отличается от 1.0.4.4
Офлайн
С 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)
...
Офлайн
model designer и Catwalk работают только с sqlobject
Офлайн
PooH, спасибо большое!
Офлайн
hildiУвы… не за что :(
PooH, спасибо большое!
Офлайн
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
Офлайн
пока проблему решил так:
в 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 sqlobjectPS SQLObject-0.8.2-py2.4.egg, debian lenny
>>> 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())
Офлайн
hildi, для твоей таблицы это будет выглядеть так
class BBPoP(SQLObject):
class sqlmeta:
fromDatabase = True
table = 'boo.bbpop'
idName = 'id_bbpop'
Офлайн
Спасибо, pythonwin!
Правда, тулбокс хоть на скрипт и не ругается, но ничего и не отображает :-)
Фиг с ним, я уже SQLAlchemy добилась нужного результата и застряла на следующем действии :-)
апд: сорри, все работает, миллион спасибо!
Отредактировано (Окт. 10, 2008 13:41:49)
Офлайн