SQLalchemy настраиваемая строка primary_key sequence - PullRequest
0 голосов
/ 19 июня 2020

Да хоть убей, я не могу придумать простого способа сделать это без запроса базы данных при создании новой записи, но это то, что я пытаюсь сделать с sqlalchemy + postgresql:

Я хотел бы, чтобы первичный ключ данной таблицы имел следующий формат: YYWW0001, YYWW0002 et c. так что я вижу такие значения, как 20010001, 20010002, так что последние четыре цифры увеличиваются только в пределах данной недели года, а затем сбрасываются при вводе новой недели или года.

Я здесь на пределе своих знаний, поэтому я очень благодарен за любую помощь! А пока смотрю sqlalchemy.schema.Sequence.

Еще одна вещь, которую я могу придумать, - это создать таблицу, которая содержит, скажем, 10000 записей, которые имеют простой первичный ключ Integer и фактический идентификатор, который мне нужен, а затем найти какой-то метод 'next', из которого можно извлечь эта таблица, когда мой основной объект построен? На мой взгляд, это не идеально, так как мне все равно нужно убедиться, что часть данных идентификатора в таблице является правильной и актуальной. Я думаю, что если есть подход Dynami c, он лучше всего удовлетворит мои потребности.

пока моя наивная реализация выглядит так:

BASE = declarative_base()
_name = os.environ.get('HW_QC_USER_ID', None)
_pass = os.environ.get('HW_QC_USER_PASS', None)
_ip = os.environ.get('HW_QC_SERVER_IP', None)
_db_name = 'mock'

try:
    print('Creating engine')
    engine = create_engine(
        f'postgresql://{_name}:{_pass}@{_ip}/{_db_name}',
        echo=False
    )
except OperationalError as _e:
    print('An Error has occured when connecting to the database')
    print(f'postgresql://{_name}:{_pass}@{_ip}/{_db_name}')
    print(_e)


class Core(BASE):
    """
    This class describes a master table.
    """
    __tablename__ = 'cores'
    udi = Column(String(11), primary_key=True, unique=True) # <-- how do I get this to be the format described?
    _date_code = Column(
        String(4),
        default=datetime.datetime.now().strftime("%y%U")
    )


BASE.metadata.create_all(engine)
session = sessionmaker(bind=engine)()
date_code_now = datetime.datetime.now().strftime("%y%U")
cores_from_this_week = session.query(Core).filter(
    Core._date_code == date_code_now
).all()
num_cores_existing = len(cores_from_this_week)
new_core = Core(
    udi=f'FRA{date_code_now}{num_cores_existing+1:04}'
)

session.add(new_core)

session.commit()

session.close()
engine.dispose()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...