У меня возникла проблема: мне нужно получить доступ к базе данных 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
Python SQLAlchemy сопоставляет имена столбцов с атрибутами и наоборот ⇐ Python
Программы на Python
1736876520
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
Подробнее здесь: [url]https://stackoverflow.com/questions/79355830/python-sqlalchemy-mapping-column-names-to-attributes-and-vice-versa[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия