Question Cyril Grosjean · Déc 27, 2023

Accéder à une RecordMap depuis SQLAlchemy

Bonjour,

Je cherche à pouvoir accéder à mes données contenus dans une RecordMap depuis SQLAlchemy, et même à toute table déjà créée auparavant.

Voici une partie de code :

TestBase:

classTestBase(DeclarativeBase):
    CreatedAt: Mapped[int] = mapped_column(TIMESTAMP, default=func.now())
    UpdatedAt: Mapped[int] = mapped_column(TIMESTAMP, default=func.now(), onupdate=func.current_timestamp())

 

Création de l'engine et binding des entités:

bases = {
    "TEST": TestBase.metadata.create_all,
}

defcreate_engine_and_session(namespace: str) -> Session:
    engine: Engine = create_engine(f"iris://_SYSTEM:SYS@localhost:1972/{namespace}") # create_engine(f'iris+emb:///{namespace}')
    metadata = MetaData()
    metadata.reflect(engine)
    bases[namespace](engine)
    OrmSession = sessionmaker(bind=engine)
    sessions[namespace] = OrmSession()
    return sessions[namespace]

Mon entité RecordMap :

classBastideRecord(TestBase):
    __tablename__ = "User_BastideRecord.Record"
    __table_args__ = {"extend_existing": True}
    __versioned__ = {}

    ID1: Mapped[int] = mapped_column(Integer, primary_key=True)
    Statut: Mapped[str] = mapped_column(String(999))
    Id: Mapped[str] = mapped_column(String(50))

Chaque partie de code sont dans des fichiers séparés, la RecordMap "User_BastideRecord.Record" est déjà créée mais cependant lorsque je vais créer mon engine, il va tenter de créer la table. Voilà l'erreur:

: ERROR #5002: ObjectScript error: OnInit+4^Grongier.PEX.BusinessProcess.1 ^8^ do ..%class."_dispatch_on_init"($this) *<class 'sqlalchemy.exc.DatabaseError'>: (intersystems_iris.dbapi._DBAPI.DatabaseError) [SQLCODE: <-1>:<Invalid SQL statement>]
[Location: <Prepare>]
[%msg: < Delimited identifier expected, delimited identifier containing invalid character '.'
found ^ CREATE TABLE "User_BastideRecord.Record">]

Je suis sur SQLAlchemy 2.0 et je cherche à avoir des entités car pour certaines tables, je vais avoir besoin de faire des updates.

Merci pour votre réponse.

Cordialement,

Cyril

EDIT : Je viens de remarquer en affichant les tables contenues dans le metadata créé et reflect sur l'engine me retournait bien les tables créées, sauf la RecordMap. Y-a-t-il donc un moyen d'obtenir les données d'un RecordMap ?

Product version: IRIS 2023.1
$ZV: IRIS for UNIX (Ubuntu Server LTS for x86-64 Containers) 2023.1.1 (Build 380U) Fri Jul 7 2023 23:53:46 EDT [Health:5.1.0-1.m1]

Comments

Sylvain Guilbaud · Jan 15, 2024

Bonjour @Cyril Grosjean 
essaie d'utiliser embedded python, en remplaçant la connexion par create_engine('iris+emb:///'):

from sqlalchemy import create_engine

_engine = create_engine('iris+emb:///')
0
Cyril Grosjean  Jan 15, 2024 to Sylvain Guilbaud

Merci pour l'information, nous sommes passés par la librairie d'iris pour récupérer les informations sur une RecordMap.

0