Python SQLAlchemy сопоставляет имена столбцов с атрибутами и наоборотPython

Программы на Python
Ответить
Anonymous
 Python SQLAlchemy сопоставляет имена столбцов с атрибутами и наоборот

Сообщение Anonymous »

У меня возникла проблема: мне нужно получить доступ к базе данных MS SQL, поэтому, естественно, соглашение об именах другое: TableName(Id, ColumnName1, ColumnName2, ABBREVIATED,...)
Как я построил модель на Python:
class TableName(Base):
__tablename__ = 'TableName'

id = Column('Id', BigInteger, primary_key=True, autoincrement=True)
order_id = Column('OrderId', BigInteger, ForeignKey('Orders.Id'), nullable=False)
column_name1 = Column('ColumnName1', String(50), nullable=True)
column_name2 = Column('ColumnName2', String(50), nullable=True)
abbreviated= Column('ABBREVIATED', String(50), nullable=False)
...

Тогда у меня есть репозиторий:
class TableNameRepository:
def __init__(self, connection_string: str):
self.engine = create_engine(connection_string)
self.Session = sessionmaker(bind=self.engine)

def get_entry(self, order_id: int, column_name1: str) -> Optional[TableName]:
with self.Session() as session:
return session.query(TableName).filter_by(
order_id=order_id,
column_name1=column_name1
).first()

Однако теперь это работает для моей реальной проблемы:
У меня есть текстовый файл шаблона с заполнителями, использующими имена столбцов SQL, что означает, что есть Id, ColumnName1, ColumnName2, ABBREVIATED, и мне нужно заменить их значениями из модели.
Вот как я пытался это сделать:
retrieved_table_entity = self.repository.get_entry(order_id, something)
attr_to_column = {
column.key: column.name
for column in retrieved_table_entity.__table__.columns
}

Проблема в том, что это не работает: ключи по-прежнему создаются следующим образом:
{'Id': 'Id', 'OrderId': 'OrderId', 'ColumnName1': 'ColumnName1', ...}
Итак, следующий шаг:
for attr_name, column_name in attr_to_column.items():
value = getattr(retrieved_table_entity, attr_name, None)
logging.debug(f"Accessing {attr_name}: {value}")
reg_dict[column_name] = '' if value is None else str(value)

Не работает, потому что ключи не являются ключами Python. При тестировании в режиме отладки, если мне вручную нравится: getattr(retrived_table_entity, 'id'), он возвращает значение .
Подводя итог:
Мне нужен способ сопоставления, чтобы у меня был словарь ключ/значение, например:
{
Id: 1
OrderID: 123
ColumnName1: 'SomeValue'
}

И тогда я мог бы просто что-то вроде self.template.format(**keys_to_values_dict)
Я пробовал консультироваться с LLM , и они продолжают кружить вокруг, не предлагая способа сделать это, я не хочу снова сопоставлять модель вручную в этой сервисной функции.
Я также просмотрел Mapping API и не могу найти что-то подходящее :
https://docs.sqlalchemy.org/en/14/orm/mapping_api.html
Для справки, мои текущие зависимости:
sqlalchemy==2.0.36
pymssql==2.2.11


Подробнее здесь: https://stackoverflow.com/questions/793 ... vice-versa
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»