Dengan perkembangan teknologi Internet yang berterusan, aplikasi dalam talian pembangunan web Python secara beransur-ansur menjadi semakin popular. SQLAlchemy ialah salah satu rangka kerja ORM (Pemetaan Objek-Kaitan) yang paling popular dalam Python Kaedah operasi pangkalan data yang cekap dan ringkas yang disediakannya bukan sahaja merealisasikan pautan yang lancar antara pembangunan web dan pangkalan data Python, tetapi juga digemari oleh banyak pembangun. Artikel ini akan berkongsi beberapa petua SQLAlchemy dalam pembangunan web Python untuk membantu pembangun menyelesaikan pembangunan projek dengan lebih cekap.
1. Gunakan contextlib untuk memastikan penutupan sesi
Rangka kerja ORM secara amnya termasuk objek Sesi. Apabila pembangun perlu berinteraksi dengan pangkalan data, objek sesi akan dibuat dan dikendalikan, tetapi objek sesi mesti ditutup selepas operasi selesai, jika tidak, beberapa masalah yang tidak dijangka akan berlaku.
Untuk memastikan pengurusan objek sesi, Python boleh menggunakan konteks contextlib untuk mengubah suai sifat sistem buat sementara waktu. Menggunakan contextlib boleh memastikan sesi ditutup sambil mengelakkan percubaan/kecuali pemprosesan yang terlalu menyusahkan Kod adalah seperti berikut:
from contextlib import contextmanager from sqlalchemy.orm import sessionmaker engine = create_engine(DB_URL) Session = sessionmaker(bind=engine) @contextmanager def session_scope(): session = Session() try: yield session session.commit() except: session.rollback() raise finally: session.close()
Kod di atas mencipta pengurus konteks session_scope dan session_scope mengehoskan objek sesi SQLAlchemy . yang merangkumi operasi pangkalan data. Dalam pembangunan sebenar, kita boleh menggunakan dengan blok sintaks untuk mengurus secara automatik penciptaan dan pemusnahan sesi.
# 使用with自动管理session的创建与销毁 with session_scope() as session: # 实现对数据库的操作
2. Gunakan Objek Pertanyaan untuk pertanyaan yang cekap
API Pertanyaan SQLAlchemy menyediakan kaedah untuk menanya pangkalan data secara pemrograman. API Pertanyaan mempunyai fungsi penapisan, pengelompokan, pengisihan dan lain-lain yang berkuasa, yang boleh membantu pembangun dengan cepat dan mudah mentakrifkan syarat pertanyaan.
Objek Pertanyaan ialah nilai pulangan Pertanyaan dan merupakan jenis data yang unik kepada SQLAlchemy. Objek Pertanyaan ialah struktur rantai, dan pernyataan pertanyaan boleh dibina dengan menambah rantai kaedah. Objek Pertanyaan boleh digunakan sebagai "templat pertanyaan" yang boleh digunakan semula di banyak tempat berbeza, sekali gus mengelakkan pertindihan kod untuk berbilang pertanyaan serupa.
# 查询books表中价格高于50的所有图书 books = session.query(Book).filter(Book.price > 50).all()
Untuk pertanyaan kompleks, berbilang kaedah boleh digunakan untuk membina pertanyaan. Contoh berikut menunjukkan cara menggunakan struktur rantaian Objek Pertanyaan untuk melaksanakan pengumpulan, pengisihan dan mengehadkan pertanyaan:
# 查询books表中,数量大于0,价格低于100元的所有书籍分页显示 books_query = session.query(Book).filter(Book.stock > 0).filter(Book.price < 100) books_query = books_query.order_by(Book.price.desc()) books_query = books_query.limit(20).offset(0) books = books_query.all()
Objek Pertanyaan juga menyokong banyak kaedah pertanyaan lain, seperti count(), first(), dsb. , yang boleh digunakan melalui dokumentasi Query View API.
3. Gunakan Laziness untuk pengoptimuman prestasi
Apabila menggunakan Query Objects untuk menanyakan sejumlah besar data, kadangkala perlu menggunakan Laziness malas loading untuk mengurangkan beban pangkalan data dan meningkatkan kecekapan pertanyaan. Kemalasan merujuk kepada pertanyaan apabila data diperlukan, dan bukannya mendapatkan hasil serta-merta selepas setiap pertanyaan.
Begini cara menggunakan Kemalasan:
# 查询users表中用户名以A开头的所有用户的ID def get_user_ids(startswith): query = session.query(User.id).filter(User.username.startswith("A")) return query
Kod di atas mengembalikan objek Query Objects, bukan senarai.
Menggunakan kaedah ini mengelakkan pertanyaan dan menyimpan keseluruhan set hasil sebelum mengambil semua hasil. Pecahkan pertanyaan kepada kelompok kecil dan muatkan data hanya apabila diperlukan. Ini boleh mengurangkan beban pada komputer dan meningkatkan kecekapan pembangunan web Python apabila menanyakan pangkalan data.
4. Gunakan Atribut Hibrid untuk mengira secara automatik
Dalam pembangunan web Python, memproses pertanyaan pada berbilang jadual pada masa yang sama biasanya memerlukan menulis banyak pernyataan pertanyaan untuk mendapatkan data. Atribut Hibrid menyediakan kaedah untuk mengendalikan perhubungan berbilang jadual, dengan pengiraan dan pengagregatan automatik.
Berikut ialah contoh kod menggunakan Atribut Hibrid:
class User(Base): __tablename__ = 'users' id = Column(Integer(), primary_key=True) name = Column(String(255), nullable=False) messages = relationship('Message') @hybrid_property def num_messages(self): return len(self.messages) @num_messages.expression def num_messages(cls): return ( select([func.count(Message.id)]) .where(cls.id == Message.user_id) .label("num_messages") )
Dalam contoh ini, num_messages boleh mengira jumlah mesej yang dimiliki pengguna secara automatik. API Pertanyaan boleh menggunakan sifat ini seolah-olah ia adalah medan dalam skema pangkalan data. Dan boleh ditanya dan ditapis seperti atribut biasa yang lain. num_messages menggunakan ciri-ciri Atribut Hibrid dan menggunakan dua definisi-satu ialah penghias yang ditakrifkan Python tulen, dan satu lagi ialah definisi ungkapan SQLalchemy.
Ringkasnya, menggunakan SQLAlchemy untuk operasi pangkalan data dalam pembangunan web Python boleh membantu pembangun melaksanakan operasi pangkalan data dengan lebih elegan dan meningkatkan kecekapan pembangunan. Artikel ini memperkenalkan beberapa kemahiran SQLAlchemy dalam pembangunan web Python, dengan harapan dapat membantu pembaca. Untuk situasi yang berbeza, kita harus menggunakan sepenuhnya API kaya yang disediakan oleh SQLAlchemy sebanyak mungkin untuk mengelakkan pertindihan kerja dan menjadikan pembangunan web Python lebih cekap.
Atas ialah kandungan terperinci Petua SQLAlchemy dalam pembangunan web Python. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!