Влияют ли как-то схемы на подключение к БД в SQLAlchemy?
2ой день не могу понять почему не могу вытащить данные из контейнера БД:
from sqlalchemy import create_engine, text, Column, Integer, String, Boolean, select
from sqlalchemy.orm import registry, as_declarative, declared_attr, Mapped, mapped_column, Session
import pymysql
pymysql.install_as_MySQLdb()
engine = create_engine('mysql://root:[email protected]:3307/my_bd', echo=True)
@as_declarative()
class AbstractModel:
id: Mapped[int] = mapped_column(autoincrement=True, primary_key=True)
class Test(AbstractModel):
__tablename__ = 'test'
name: Mapped[str] = mapped_column(String(100), unique=True, nullable=False)
with Session (engine) as session:
with session.begin():
result = session.execute(select(Test).where(Test.name == 'TestName'))
test= result.scalar()
print('result:', result)
print('test:', test)
print('test.name:', test.name)
Пародокс вот в чем:
Если создать БД в OpenServer, и создать там Таблицу, то данные вытаскиваются и все работает, но если я указываю в качестве подключения Docker-контейнер (к которому имею подключение через DataGrid), то никакой выборки нет и выдает: следующее:
2023-12-02 12:21:00,733 INFO sqlalchemy.engine.Engine SELECT DATABASE()
2023-12-02 12:21:00,733 INFO sqlalchemy.engine.Engine [raw sql] {}
2023-12-02 12:21:00,737 INFO sqlalchemy.engine.Engine SELECT @@sql_mode
2023-12-02 12:21:00,737 INFO sqlalchemy.engine.Engine [raw sql] {}
2023-12-02 12:21:00,738 INFO sqlalchemy.engine.Engine SELECT @@lower_case_table_names
2023-12-02 12:21:00,738 INFO sqlalchemy.engine.Engine [raw sql] {}
2023-12-02 12:21:00,742 INFO sqlalchemy.engine.Engine BEGIN (implicit)
2023-12-02 12:21:00,746 INFO sqlalchemy.engine.Engine SELECT test.name, test.id
FROM test
WHERE test.name = %(name_1)s
2023-12-02 12:21:00,746 INFO sqlalchemy.engine.Engine [generated in 0.00026s] {'name_1': 'TestName'}
result: <sqlalchemy.engine.result.ChunkedIteratorResult object at 0x0000026F4AB52900>
test: None
2023-12-02 12:21:00,752 INFO sqlalchemy.engine.Engine ROLLBACK
Traceback (most recent call last):
File "D:\ESOFT\my_app\app\flask_app\test_coonect.py", line 47, in <module>
print('test.name:', test.name)
AttributeError: 'NoneType' object has no attribute 'name'
М/б как-то влияют схемы в БД контейнера?
--
UPD:
Вот скрин из DataGrid, где видно что есть схемы и таблицы в подключаемой БД (которая в контейнере)

Ответы (1 шт):
Автор решения: Алексей
→ Ссылка
Во-общем, моя гипотеза подтвердилсь. Надо указывать схемы, раз они используются в БД. Вот, если кто столкнется:
from sqlalchemy import Column, create_engine, ForeignKey, Integer, String, Boolean, select
from sqlalchemy.orm import declarative_base, Session
Base = declarative_base()
class Test(Base):
__tablename__ = "test"
__table_args__ = {"schema": "my_schema"}
id = Column(Integer, unique=True, primary_key=True)
name = Column(String(100), nullable=False)
import pymysql
pymysql.install_as_MySQLdb()
engine = create_engine('mysql://root:[email protected]:3307/my_bd', echo=True)
with Session (engine) as session:
with session.begin():
result = session.execute(select(Test).where(Test.name == 'TestName'))
test = result.scalar()
print('result:', result)
print('test :', test )
print('test.name:', test.name)