Найти - Пользователи
Полная версия: SQLalchemy autoload с уникальным ключем из нескольких строк
Начало » Python для новичков » SQLalchemy autoload с уникальным ключем из нескольких строк
1 2
Mazay_Ka
Вот столкнулся с такой проблемой.
Есть таблица где уникальный ключ состоит из трех колонок в сумме. Как задать таблицу
примерно так, только задав ей еще ее 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()
Спасибо за ответ.
4kpt_III
Готовая уже таблица? Т.е. вы коннектитесь к готовой таблице у которой вообще нет primary_key, я правильно понял?
Mazay_Ka
4kpt_III
Готовая уже таблица? Т.е. вы коннектитесь к готовой таблице у которой вообще нет primary_key, я правильно понял?

ага там primary_key состоит из трех полей
sander
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()
4kpt_III
Если используем 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')
        )
Mazay_Ka
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’
Mazay_Ka
4kpt_III
Если используем Declartive, тогда

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

productID, optionID это колонки которые ключи?
4kpt_III
Вы все неправильно поняли. Эти настройки вкладываются внутрь конкретных моделей, которые описывают конкретные таблицы.
Mazay_Ka
спасибо большое разобрался надо было, еще имя таблицы дописать
Mazay_Ka
Привет.
Чтобы не создавать новую тему вопрос по этой же задаче обновляю поля в таблице примерно так

   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’)

в чем проблема, много апдейтов? там полей очень много за сто тысяч, структура таблиц локально и на сервере одинаковая разница только в обьеме данных.
Спасибо за ответ.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB