Heim  >  Artikel  >  Backend-Entwicklung  >  Eine kurze Einführung in SQLAlchemy unter Python

Eine kurze Einführung in SQLAlchemy unter Python

不言
不言nach vorne
2018-10-23 16:44:242790Durchsuche
Dieser Artikel bietet Ihnen eine detaillierte Erklärung der PHP-Synergie-Implementierung (mit Code). Freunde in Not können sich darauf beziehen.

SQLAlchemy ist eine Open-Source-Software unter der Programmiersprache Python. SQLAlchemy bietet SQL-Toolkit und objektrelationale Mapping-Tools (ORM) und wird unter der MIT-Lizenz veröffentlicht. Es implementiert ein vollständiges Persistenzmodell der Enterprise-Klasse mit einfacher Python-Sprache, das für einen effizienten und leistungsstarken Datenbankzugriff konzipiert ist. SQLAlchemy legt großen Wert auf die Größe und Leistung der Datenbank.

In diesem Abschnitt wird die Verwendung von SQLAlchemy anhand einer Reihe von Beispielen analysiert.

Für die Verwendung von SQLAlchemy sind mindestens drei Codeteile erforderlich: Tabellen definieren, Datenbankverbindungen definieren und logische Operationen wie Hinzufügen, Löschen, Ändern und Abfragen ausführen.

Instanz der Definitionstabelle:

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column,Integer,String
Base=declarative_base()
class Accout(Base):
    __tablename__=u'accout'
    id=Column(Integer,primary_key=True)
    user_namr=Column(String(50),nullable=False)
    password=Column(String(200),nullable=False)
    title=Column(String(50))
    salary=Column(Integer)

    def is_active(self):
        #假设所有
        return True

    def get_id(self):
        #返回账号ID,用方法返回属性值提高了表的封装性。
        return self.id

    def is_authenticated(self):
        #假设已经通过验证
        return True

    def is_anonymous(self):
        #具有登陆名和密码的账号不是匿名用户
        return False

Der Code zum Parsen der Definitionstabelle lautet wie folgt:

  • SQLAlchemy muss sein Wird vor der SQLAlchemy-Tabelle .ext.declarative_base eingeführt und definiert eine Instanzbasis davon. Alle Tabellen müssen von Base erben. In diesem Beispiel wird eine Kontotabellenklasse Account definiert.

  • definiert das tatsächliche Namenskonto der Tabelle in der Datenbank über das Attribut __tablename__.

  • Führen Sie die Typen Column, Integer und String im sqlalchemy-Paket ein, da sie zum Definieren von Spalten in der Tabelle verwendet werden müssen. In diesem Beispiel werden fünf Spalten in der Tabelle „Konto“ definiert, nämlich die Ganzzahl-ID und das Gehalt sowie die Zeichenfolgentypen „Benutzername“, „Kennwort“ und „Titel“.

  • Sie können Einschränkungen definieren, indem Sie beim Definieren von Spalten Parameter an Column übergeben. In diesem Beispiel wird der Parameter „primary_key“ verwendet, um die ID-Spalte als Primärschlüssel zu definieren, und der nullbare Parameter wird verwendet, um „user__name“ und „password“ als ungleich Null zu definieren.

  • Sie können auch andere Funktionen in der Tabelle anpassen. Dieses Beispiel definiert mehrere Funktionen, die häufig bei der Benutzerauthentifizierung verwendet werden: is__activite(), get__id(), is__authenticate() und is_anonymous().

Der Beispielcode zum Definieren der Datenbankverbindung lautet wie folgt:

from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session,sessionmaker
from contextlib import contextmanager

db_connect_string='mysql://v_user:v_pase@localhost:3306/test_database?charset=utf8'

ssl_args={
    'ssl':{
        'cert':'/home/ssl/client-cert.pem',
        'key':'/home/shouse/ssl/client-key.pem',
        'ca':'/home/shouse/ssl/ca-cert.pem'
    }
}
engine=create_engine(db_connect_string,connect_args=ssl_args)
SessionType=scoped_session(sessionmaker(bind=engine,expire_on_commit=False))
def GetSession():
    return SessionType()

@contextmanager
def session_scope():
    session=GetSession()
    try:
        yield session
        session.commit()
    except:
        session.rollback()
        raise
    finally:
        session.close()

Der Code zum Parsen des Datenteils dieser Verbindung lautet wie folgt :

  • Einführung in Datenbank- und Sitzungs-Engines: sqlalchemy.create_engine, sqlalchemy.orm.scoped_session, sqlalchemy.orm.sessionmaker.

  • Definieren Sie die Datenbankzeichenfolge, die zum Herstellen einer Verbindung zur Datenbank erforderlich ist. In diesem Beispiel ist die MySQL-Datenbank verbunden. Das Zeichenfolgenformat ist [databse_type]://[user_name]:[password]@[domain]:[port]/[database]?[parameters ]. In diesem Beispiel wird zusätzlich zu den erforderlichen Verbindungsinformationen auch der Parameter charset übergeben, der die UTF-8-Kodierungsmethode zum Dekodieren der Zeichenfolge in der Datenbank angibt.

  • Verwenden Sie create_engine, um eine Datenbank-Engine zu erstellen. Wenn für die Datenbank eine SSL-Verbindung aktiviert ist, müssen Sie hier den Dateipfad des SSL-Client-Zertifikats übergeben.

  • Verwenden Sie „scoped_session(sessionmaker(bind=engine))“, um den Sitzungstyp „SessionType“ zu erstellen, und definieren Sie die Funktion „GetSession()“, um eine Instanz von „SessionType“ zu erstellen.

An diesem Punkt können Sie die Funktion GetSession() verwenden, um eine Datenbanksitzung zu erstellen und Datenbankoperationen durchzuführen. Um jedoch nachfolgenden Datenbankoperationscodes die automatische Durchführung der Transaktionsverarbeitung zu ermöglichen, wird in diesem Beispiel die Kontextfunktion session_scope() definiert. Die Möglichkeit, eine Kontextfunktion in Python zu definieren, besteht darin, den Contextmanager-Dekorator zum contextlib-Paket hinzuzufügen. Führen Sie die folgende Logik in der Kontextfunktion aus: Richten Sie zu Beginn der Funktion eine Datenbanksitzung ein, und zu diesem Zeitpunkt wird automatisch eine Datenbanktransaktion eingerichtet: Setzen Sie die Transaktion zurück, wenn eine Ausnahme auftritt, und schließen Sie die Verbindung beim Beenden. Der Transaktions-Commit-Vorgang wird automatisch ausgeführt, wenn die Verbindung geschlossen wird.

Code für Datenbankoperationen:

from sqlalchemy import or_,orm
def InsertAccount(user,passwd,title,salary): #新增操作
    with session_scope() as session:
        account=orm.Account(user_name=user,passwd=passwd,title=title,salary=salary)
        session.add(account)

def GetAccount(id=None,user_name=None): #查询操作
    with session_scope() as session:
        return session.query(orm.Account).filter(
            or_(orm.Account.id==id,orm.Account.user_name=user_name)
        ).first()

def DeleteAccount(user_name): #删除操作
    with session_scope() as session:
        account=GetAccount(user_name=user_name)
        if account:
            session.delete(account)

def UpdateAccount(id,user_name,password,title,salary):  #更新操作
    with session_scope() as session:
        account=session.query(orm.Account).filter(orm.Account.id==id).first()
        if not account:return
        account.user_name=user_name
        account.password=password
        account.salary=salary
        account.title=title


InsertAccount("Mark","123","Manager",3000)  #调用新增操作
InsertAccount("帅哥","456","Boss",2000)  #调用新增操作
GetAccount(2) #调用查询操作
DeleteAccount("Mark")
UpdateAccount(1,"admin","none","System admin",2500)

Dieses Beispiel zeigt die vier am häufigsten verwendeten datensatzbasierten Operationen in der Datenbank: Hinzufügen, Suchen, Löschen und Aktualisieren. Die Analyse dieses Teils des Codes lautet wie folgt:

  • Verwenden Sie die Importanweisung, um das Paketorm einzuführen, in dem sich die Datentabelle (Konto) befindet. Verwenden Sie or_, wenn Sie Abfragen mit mehreren Bedingungen einführen.

  • In jeder Funktion wird die Kontextfunktion session_scope() durch die with-Anweisung aktiviert, durch die das Sitzungsobjekt abgerufen und neue Dinge automatisch gestartet werden.

  • Erstellen Sie in InsertAccount eine neue Tabellenkontoinstanz und fügen Sie sie über session.add zur Datenbank hinzu. Da die Transaktion automatisch festgeschrieben wird, wenn die Kontextfunktion beendet wird, ist es nicht erforderlich, session.commit() explizit aufzurufen, damit der neue Zusatz wirksam wird.

  • wird über die Abfrageanweisung in GetAccount abgefragt. Die Abfragebedingungen werden per Filter festgelegt, indem or_ oder and_ verwendet werden.

  • Fragen Sie das Objekt über GetAccount in DeleteAccount ab. Wenn es gefunden wird, rufen Sie session.delete() direkt auf, um das Objekt zu löschen.

  • Fragen Sie in InsertAccount() den Datensatz anhand der ID über die Abfrage ab. Wenn die Abfrage gefunden wird, ändern Sie den Datensatz, indem Sie die Eigenschaften des Objekts festlegen.

  • Das Ergebnis der Abfrageanweisung ist eine Sammlung von Objekten. Die Funktion first() nach der Abfrageanweisung wird verwendet, um das erste Objekt in der Sammlung zu extrahieren. Wenn die Funktion first() durch die Funktion all() ersetzt wird, gibt die Abfrage die Sammlung zurück.

Mainstream-Datenbankverbindungsmethoden

Orm-Datenbankbetriebsmethoden wie SQLAlchemy können Geschäftsentwickler vor den Unterschieden zwischen verschiedenen Datenbanken schützen, also bei der Datenbankmigration erforderlich ist (z. B. MySQL zu SQLite), müssen Sie nur die Datenbankverbindungszeichenfolge ändern.

In der folgenden Tabelle wird aufgeführt, wie Datenbankzeichenfolgen geschrieben werden, wenn SQLAlchemy eine Verbindung zu Mainstream-Datenbanken herstellt:

数据库 连接字符串
Microsoft SQLServer 'mssql+pymssql://[user]:[pass]@[domain]:[port]/[dbname]'
MySQL 'mysql://[user]:[pass]@[domain]:[port]/[dbname]'
Oracle 'oracle://[user]:[pass]@[domain]:[port/[dbname]]'
PostgreSQL 'postgresql://[user]:[pass]@[domain]:[port]/[dbname]'
SQLite 'sqlite://[file_pathname]'

Das obige ist der detaillierte Inhalt vonEine kurze Einführung in SQLAlchemy unter Python. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:segmentfault.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen