Уведомления

Группа в Telegram: @pythonsu

#1 Май 6, 2015 16:06:07

Mazay_Ka
Зарегистрирован: 2013-04-03
Сообщения: 59
Репутация: +  0  -
Профиль   Отправить e-mail  

SQLalchemy autoload с уникальным ключем из нескольких строк

Вот столкнулся с такой проблемой.
Есть таблица где уникальный ключ состоит из трех колонок в сумме. Как задать таблицу
примерно так, только задав ей еще ее primary key суммой трех столбцов, без этого выдает ошибку что не может найти уникальный столбец ключ

class base(Base):
    engine = create_engine(url)
    metadata = MetaData(bind=engine)
    __table__ =  Table('table', metadata, autoload = True)
    Session = sessionmaker(bind=engine)
    session = Session()
Спасибо за ответ.

Отредактировано Mazay_Ka (Май 6, 2015 16:06:26)

Офлайн

#2 Май 6, 2015 16:10:18

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

SQLalchemy autoload с уникальным ключем из нескольких строк

Готовая уже таблица? Т.е. вы коннектитесь к готовой таблице у которой вообще нет primary_key, я правильно понял?

Офлайн

#3 Май 6, 2015 16:48:30

Mazay_Ka
Зарегистрирован: 2013-04-03
Сообщения: 59
Репутация: +  0  -
Профиль   Отправить e-mail  

SQLalchemy autoload с уникальным ключем из нескольких строк

4kpt_III
Готовая уже таблица? Т.е. вы коннектитесь к готовой таблице у которой вообще нет primary_key, я правильно понял?

ага там primary_key состоит из трех полей

Офлайн

#4 Май 6, 2015 16:55:50

sander
Зарегистрирован: 2015-02-19
Сообщения: 317
Репутация: +  53  -
Профиль   Отправить e-mail  

SQLalchemy autoload с уникальным ключем из нескольких строк

Mazay_Ka

from sqlalchemy.orm import mapper, sessionmaker
class MyTable:
    pass
engine = create_engine(url)
metadata = MetaData(bind=engine)
my_table = Table('my_table', metadata, autoload=True)
mapper(MyTable, my_table)
 
Session = sessionmaker(bind=engine)
session = Session()

Офлайн

#5 Май 6, 2015 17:02:38

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

SQLalchemy autoload с уникальным ключем из нескольких строк

Если используем Declartive, тогда

class MyBase(Base):
    __table_args__ = (PrimaryKeyConstraint('productID', 'optionID'),)

Или

class MyBase(Base):
    __mapper_args__ = {"primary_key": (productID, optionID)}

Если построение на уровне таблицы, тогда

my_table = Table('mytable', metadata,
            Column('id', Integer),
            Column('version_id', Integer),
            Column('data', String(50)),
            PrimaryKeyConstraint('id', 'version_id', name='mytable_pk')
        )

Отредактировано 4kpt_III (Май 6, 2015 17:03:12)

Офлайн

#6 Май 7, 2015 15:03:11

Mazay_Ka
Зарегистрирован: 2013-04-03
Сообщения: 59
Репутация: +  0  -
Профиль   Отправить e-mail  

SQLalchemy autoload с уникальным ключем из нескольких строк

4kpt_III
Если используем Declartive, тогда
да declaritive так получается ошибка

class Mybase(Base):
    engine = create_engine(url)
    metadata = MetaData(bind=engine)
    __table__ =  Table(table_name, metadata, autoload = True)
    __mapper_args__ = {"primary_key": ('id1', 'id2', 'id3')}
    Session = sessionmaker(bind=engine)
    session = Session()


**mapper_args
File “<string>”, line 2, in mapper
File “C:\Python27\lib\site-packages\sqlalchemy\orm\mapper.py”, line 623, in __init__
self._configure_pks()
File “C:\Python27\lib\site-packages\sqlalchemy\orm\mapper.py”, line 1204, in _configure_pks
if k.table not in self._pks_by_table:
AttributeError: ‘str’ object has no attribute ‘table’

Офлайн

#7 Май 7, 2015 15:09:39

Mazay_Ka
Зарегистрирован: 2013-04-03
Сообщения: 59
Репутация: +  0  -
Профиль   Отправить e-mail  

SQLalchemy autoload с уникальным ключем из нескольких строк

4kpt_III
Если используем Declartive, тогда

я правильно понял __mapper_args__ = {“primary_key”: (productID, optionID)}

productID, optionID это колонки которые ключи?

Офлайн

#8 Май 7, 2015 15:12:28

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

SQLalchemy autoload с уникальным ключем из нескольких строк

Вы все неправильно поняли. Эти настройки вкладываются внутрь конкретных моделей, которые описывают конкретные таблицы.

Офлайн

#9 Май 7, 2015 15:32:51

Mazay_Ka
Зарегистрирован: 2013-04-03
Сообщения: 59
Репутация: +  0  -
Профиль   Отправить e-mail  

SQLalchemy autoload с уникальным ключем из нескольких строк

спасибо большое разобрался надо было, еще имя таблицы дописать

Офлайн

#10 Май 13, 2015 10:47:02

Mazay_Ka
Зарегистрирован: 2013-04-03
Сообщения: 59
Репутация: +  0  -
Профиль   Отправить e-mail  

SQLalchemy autoload с уникальным ключем из нескольких строк

Привет.
Чтобы не создавать новую тему вопрос по этой же задаче обновляю поля в таблице примерно так

   for item in dict.items():
        tables.table_1.session.query(tables.table_1).filter_by(id = item[0]).update({'param_1':item[1][1], param_2':item[1][0]})
        tables.table_2.session.query(tables.table_2).filter_by(id = item[0]).update({'param_1':item[1][1], 'param_2':item[1][0]})
        tables.table_3.session.query(tables.table_3).filter_by(id = item[0]).update({'param_1':item[1][1], 'param_2':item[1][0]})
    tables.table_1.commit()
    tables.table_2.session.commit()
    tables.table_3.session.commit()  

локально у меня на denwer все обновляется нормально, но локально данных у меня по меньше,
когда тоже самое делаю на сервере то выбивает ошибку

sqlalchemy.exc.OperationalError: (OperationalError) (1213, ‘Deadlock found when trying to get lock; try restarting transaction’)

в чем проблема, много апдейтов? там полей очень много за сто тысяч, структура таблиц локально и на сервере одинаковая разница только в обьеме данных.
Спасибо за ответ.

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version