Да хоть убей, я не могу придумать простого способа сделать это без запроса базы данных при создании новой записи, но это то, что я пытаюсь сделать с 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()