Форум сайта python.su
0
Вот столкнулся с такой проблемой.
Есть таблица где уникальный ключ состоит из трех колонок в сумме. Как задать таблицу
примерно так, только задав ей еще ее 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)
Офлайн
39
Готовая уже таблица? Т.е. вы коннектитесь к готовой таблице у которой вообще нет primary_key, я правильно понял?
Офлайн
0
4kpt_III
Готовая уже таблица? Т.е. вы коннектитесь к готовой таблице у которой вообще нет primary_key, я правильно понял?
Офлайн
53
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()
Офлайн
39
Если используем 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)
Офлайн
0
4kpt_IIIда declaritive так получается ошибка
Если используем Declartive, тогда
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()
Офлайн
0
4kpt_III
Если используем Declartive, тогда
Офлайн
39
Вы все неправильно поняли. Эти настройки вкладываются внутрь конкретных моделей, которые описывают конкретные таблицы.
Офлайн
0
спасибо большое разобрался надо было, еще имя таблицы дописать
Офлайн
0
Привет.
Чтобы не создавать новую тему вопрос по этой же задаче обновляю поля в таблице примерно так
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()
Офлайн