Python module to work with Magneto Database directly without using broken Magento 2 core
PyGento is built on top of the SQL Alchemy
SQLAlchemy is a library that facilitates the communication between Python programs and Magento databases. This library acts as an Object Relational Mapper (ORM) tool that translates Python classes to Magento tables and automatically converts function calls to SQL statements.
SQLAlchemy allow developers to create and ship enterprise-grade, production-ready Magento 2 applications easily and lets developers focus on business logic.
SQLAlchemy is the Python SQL toolkit and Object Relational Mapper that gives application developers the full power and flexibility of SQL.
It provides a full suite of well known enterprise-level persistence patterns, designed for efficient and high-performing database access, adapted into a simple and Pythonic domain language.
Python abstaraction over magento database has multiple Models per file vs Magento one file per Class
Python is not exclusively class-based – the natural unit of code decomposition in Python is the module. Modules are just as likely to contain functions (which are first-class objects in Python) as classes. In PHP Magento, the unit of decomposition is the class. PyGento hes several models per file. each model represent DB table. One PyGento model file contains all the classes for e-Commerce function (Catalog, Sales, Customer, Quote, Inventory).
Python is much more expressive than Magento, and if you restrict yourself to one class per file (which Python does not prevent you from doing) you will end up with lots of very small files – more to keep track of with very little benefit.
from sqlalchemy import create_engine engine = create_engine('mysql+pymysql://root:******@127.0.0.1/magento2') engine.connect()
Load Magento Model
from models.catalog import CatalogProductEntity as Product products = db.query(Product).all() for product in products: print ("Product:", product.__dict__) print ("Product Sku:", product.sku)
Many To One¶
Many to one places a foreign key in the parent table referencing the child. relationship() is declared on the parent, where a new scalar-holding attribute will be created:
class Parent(Base): __tablename__ = 'parent' id = Column(Integer, primary_key=True) child_id = Column(Integer, ForeignKey('child.id')) child = relationship("Child") class Child(Base): __tablename__ = 'child' id = Column(Integer, primary_key=True)
Bidirectional behavior is achieved by adding a second relationship() and applying the relationship.back_populates parameter in both directions:
__tablename__ = 'parent' id = Column(Integer, primary_key=True) child_id = Column(Integer, ForeignKey('child.id')) child = relationship("Child", back_populates="parents") class Child(Base): __tablename__ = 'child' id = Column(Integer, primary_key=True) parents = relationship("Parent", back_populates="child")
Alternatively, the relationship.backref parameter may be applied to a single relationship(), such as Parent.child:
class Parent(Base): __tablename__ = 'parent' id = Column(Integer, primary_key=True) child_id = Column(Integer, ForeignKey('child.id')) child = relationship("Child", backref="parents")
Acording the performace test PyGento returns 1-20 order data in 1ms when Magento requires 200+ ms
engine = create_engine('mysql+pymysql://root:******@127.0.0.1/magento2', echo=True)
if True, the Engine will log all statements as well as a repr() of their parameter lists to the default log handler, which defaults to sys.stdout for output. If set to the string “debug”, result rows will be printed to the standard output as well.