


Bagaimana untuk mengubah suai kod SQL perniagaan berdasarkan masa jalan dalam Python?
1. Origin
Baru-baru ini, projek sedang bersedia untuk melaksanakan SASS Salah satu ciri SASS ialah penyewaan berbilang, dan data antara setiap penyewa mesti diasingkan untuk pangkalan data . Pengasingan, pengasingan jadual, pengasingan medan, pada masa ini saya hanya menggunakan pengasingan jadual dan pengasingan medan (prinsip pengasingan pangkalan data adalah serupa). Pengasingan medan agak mudah, iaitu syarat pertanyaan adalah berbeza Sebagai contoh, pertanyaan SQL berikut:
1 |
|
Tetapi demi ketelitian, adalah perlu untuk menyemak sama ada. jadual yang sepadan disertakan sebelum melaksanakan SQL Medan pertanyaan tenant_id
.
Untuk pengasingan jadual, ia lebih menyusahkan ia perlu memproses jadual data tertentu mengikut ID penyewa yang sepadan sebagai contoh, jika terdapat pertanyaan SQL seperti berikut:
1 |
|
Apabila menemui penyewa A, pertanyaan SQL akan menjadi:
1 |
|
Apabila menemui penyewa B, pertanyaan SQL akan menjadi:
1 |
|
Jika bilangan pedagang tetap, ia biasanya cukup untuk menulis if-else
dalam kod untuk menilai Walau bagaimanapun, pedagang untuk aplikasi SASS biasa akan ditambah sepanjang masa, jadi logik SQL akan menjadi Seperti ini: <🎜. >
1 2 3 |
|
pada mulanya, tetapi kini ia perlu mencipta berbilang objek jadual berdasarkan berbilang pedagang Tidak realistik. Kedua, jika anda menulis SQL telanjang, anda biasanya akan menggunakan IDE untuk menyemaknya sudah sangat besar. Jika setiap panggilan jadual yang berkaitan disesuaikan dan diubah, jumlah kerja akan menjadi sangat besar Oleh itu, penyelesaian terbaik adalah untuk mendapatkan pernyataan SQL yang diluluskan oleh pengguna selepas pustaka enjin dan masih SQL diubah secara automatik pada ID pedagang sebelum dihantar ke pelayan t_demo
Untuk mencapai kesan ini, kami mesti menyerang perpustakaan enjin
MySQL
MySQL
Sama ada anda menggunakan
, anda boleh menentukan perpustakaan enjin yang biasa digunakan pada masa ini ialahMemandangkan kita mesti menyerang perpustakaan enjin yang kita gunakan, kita harus terlebih dahulu menentukan kaedah perpustakaan enjin yang perlu kita ubah suai , I Adalah ditentukan bahawa hanya, jadi yang berikut akan menggunakan
dbutils
sebagai contoh.sqlalchemy
pymysql
pymysql
2. Serbu perpustakaan
kaedah
perlu diubah:1 |
|
pymysql.cursors.Cursor
Fungsi kaedah ini adalah untuk menyepadukan SQL dan parameter yang diluluskan oleh pengguna untuk menghasilkan SQL akhir, yang hanya memenuhi keperluan kita, supaya ia boleh diluluskan Gunakan idea warisan untuk mencipta kelas mogrify
baharu kita sendiri: 1 2 3 4 5 6 7 8 9 10 11 12 |
|
Selepas mencipta kelas Cursor
, kita perlu mempertimbangkan cara menggunakan diperibadikan
, perpustakaan sambungan Cursor
umum menyokong kami untuk lulus dalam kelas pymysql
tersuai, seperti Cursor
:Mysql
1 2 3 4 5 6 7 8 9 10 |
|
Cursor
Kami boleh menentukan kelas pymysql
kami melalui , Jika pustaka yang digunakan tidak menyokongnya atau atas sebab lain, anda perlu menggunakan kaedah tampalan monyet Untuk kaedah penggunaan tertentu, lihat Probe Python untuk melengkapkan pengekstrakan data pustaka panggilan. cursorclass
3. Dapatkan ID pedagangCursor
kaedah Untuk menggantikan, secara amnya apabila kita memanggil sekeping kod, terdapat dua cara untuk menghantar parameter Satu adalah untuk lulus parameter jenis tatasusunan:
1 2 3 4 5 6 7 8 9 10 |
|
Yang lain adalah untuk lulus parameter jenis kamus: mogrify
1 2 |
|
dan
kepada selepas diproses apabila melaksanakan execute
Jika kami Menggunakan parameter jenis kamus, kami boleh membenamkan parameter yang kami perlukan di dalamnya dan mengekstraknya dalam sql
Walau bagaimanapun, jika anda menggunakan parameter jenis tatasusunan atau pustaka ORM, ia akan menjadi lebih sukar untuk menghantar parameter kepada kaedah args
Parameter ini kaedah mogrify
secara tersirat melalui mogrify
Analisis dan prinsip khusus boleh didapati dalam: Cara menggunakan analisis kod sumber modul contextvars dalam python. Penggunaan mogrify
context
mogrify
adalah sangat mudah Pertama, buat kelas yang dirangkumkan oleh
1 2 |
|
context
Seterusnya, dalam kod perniagaan, masukkan parameter yang sepadan dengan perniagaan semasa. melalui konteks: context
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
dalam
untuk mendapatkan parameter yang sepadan:1 2 3 4 5 |
|
mogrify
4 Ubah suai SQLcontext
Sekarang, semuanya sudah sedia, cuma Selebihnya adalah untuk mengubah suai logik SQL Semasa saya mengerjakan projek lain sebelum ini, jadual yang saya bina adalah sangat standard. Mereka menamakan jadual dalam format Nama jadual. Ia hanya perlu dilakukan dua kali Penggantian boleh serasi dengan kebanyakan situasi1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import pymysql
class
Cursor(pymysql.cursors.Cursor):
def mogrify(self, query: str, args: Union[None, list, dict, tuple] = None) -> str:
tenant_id: str = context.tenant_id
replace_table_set: Set[str] = context.replace_table_set
# 简单示例,实际上正则的效率会更好
for
replace_table in replace_table_set:
if
replace_table in query:
# 替换表名
query = query.replace(f
" {replace_table} "
, f
" {replace_table}_{tenant_id} "
)
# 替换查询条件中带有表名的
query = query.replace(f
" {replace_table}."
, f
" {replace_table}_{tenant_id}."
)
mogrify_sql: str = super().mogrify(query, args)
# 在此可以编写处理合成后的SQL逻辑
return
mogrify_sql
Salin selepas log masuk
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
但是现在项目的SQL规范并不是很好,有些表名还是MySQL
的关键字,所以靠简单的替换是行不通的,同时这个需求中,一些表只需要字段隔离,需要确保有带上对应的字段查询,这就意味着必须有一个库可以来解析SQL
,并返回一些数据使我们可以比较方便的知道SQL
中哪些是表名,哪些是查询字段了。
目前在Python中有一个比较知名的SQL
解析库--sqlparse,它可以通过解析引擎把SQL解析成一个Python对象
,之后我们就可以通过一些语法来判断哪些是SQL
关键字, 哪些是表名,哪些是查询条件等等。但是这个库只实现一些底层的API,我们需要对他和SQL比较了解之后才能实现一些比较完备的功能,比如下面3种常见的SQL:
1 2 3 |
|
如果我们要通过sqlparse
来提取表名的话就需要处理这3种情况,而我们如果要每一个情况都编写出来的话,那将会非常费心费力,同时也可能存在遗漏的情况,这时就需要用到另外一个库--sql_metadata,这个库是基于sqlparse
和正则的解析库,同时提供了大量的常见使用方法的封装,我们通过直接调用对应的函数就能知道SQL
中有哪些表名,查询字段是什么了。
目前已知这个库有一个缺陷,就是会自动去掉字段的符号, 比如表名为关键字时,我们需要使用`符号把它包起来:
1 |
|
但在经过sql_metadata
解析后得到的表名是case
而不是`case`,需要人为的处理,但是我并不觉得这是一个BUG,自己不按规范创建表,能怪谁呢。
接下来就可以通过sql_metadata
的方法来实现我需要的功能了,在根据需求修改后,代码长这样(说明见注释):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
|
这份代码十分简单,它只做简单介绍,事实上这段逻辑会应用到所有的SQL
查询中,我们应该要保证这段代码是没问题的,同时不要有太多的性能浪费,所以在使用的时候要考虑到代码拆分和优化。 比如在使用的过程中可以发现,我们的SQL
转换和检查都是在父类的Cursor.mogrify
之前进行的,这就意味着不管我们代码逻辑里cursor.execute
传的参数是什么,对于同一个代码逻辑来说,传过来的query
值是保持不变的,比如下面的代码:
1 2 3 4 |
|
这段代码中传到Cursor.mogrify
的query永远为SELECT * FROM t_user WHERE uid=%(uid)s,有变化的只是args中uid的不同。 有了这样的一个前提条件,那么我们就可以把query
的校验结果和转换结果缓存下来,减少每次都需要解析SQL
再校验造成的性能浪费。至于如何实现缓存则需要根据自己的项目来决定,比如项目中只有几百个SQL
执行,那么直接用Python
的dict
来存放就可以了,如果项目中执行的SQL
很多,同时有些执行的频率非常的高,有些执行的频率非常的低,那么可以考虑使用LRU
来缓存。
Atas ialah kandungan terperinci Bagaimana untuk mengubah suai kod SQL perniagaan berdasarkan masa jalan dalam Python?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Gunakan kebanyakan editor teks untuk membuka fail XML; Jika anda memerlukan paparan pokok yang lebih intuitif, anda boleh menggunakan editor XML, seperti editor XML oksigen atau XMLSPY; Jika anda memproses data XML dalam program, anda perlu menggunakan bahasa pengaturcaraan (seperti Python) dan perpustakaan XML (seperti XML.Etree.ElementTree) untuk menghuraikan.

Permohonan yang menukarkan XML terus ke PDF tidak dapat dijumpai kerana mereka adalah dua format yang berbeza. XML digunakan untuk menyimpan data, manakala PDF digunakan untuk memaparkan dokumen. Untuk melengkapkan transformasi, anda boleh menggunakan bahasa pengaturcaraan dan perpustakaan seperti Python dan ReportLab untuk menghuraikan data XML dan menghasilkan dokumen PDF.

Alat pemformatan XML boleh menaip kod mengikut peraturan untuk meningkatkan kebolehbacaan dan pemahaman. Apabila memilih alat, perhatikan keupayaan penyesuaian, pengendalian keadaan khas, prestasi dan kemudahan penggunaan. Jenis alat yang biasa digunakan termasuk alat dalam talian, pemalam IDE, dan alat baris arahan.

Tidak ada XML percuma yang mudah dan langsung ke alat PDF di mudah alih. Proses visualisasi data yang diperlukan melibatkan pemahaman dan rendering data yang kompleks, dan kebanyakan alat yang dipanggil "percuma" di pasaran mempunyai pengalaman yang buruk. Adalah disyorkan untuk menggunakan alat sampingan komputer atau menggunakan perkhidmatan awan, atau membangunkan aplikasi sendiri untuk mendapatkan kesan penukaran yang lebih dipercayai.

Kelajuan XML mudah alih ke PDF bergantung kepada faktor -faktor berikut: kerumitan struktur XML. Kaedah Penukaran Konfigurasi Perkakasan Mudah Alih (Perpustakaan, Algoritma) Kaedah Pengoptimuman Kualiti Kod (Pilih perpustakaan yang cekap, mengoptimumkan algoritma, data cache, dan menggunakan pelbagai threading). Secara keseluruhannya, tidak ada jawapan mutlak dan ia perlu dioptimumkan mengikut keadaan tertentu.

Tidak mustahil untuk menyelesaikan penukaran XML ke PDF secara langsung di telefon anda dengan satu aplikasi. Ia perlu menggunakan perkhidmatan awan, yang boleh dicapai melalui dua langkah: 1. Tukar XML ke PDF di awan, 2. Akses atau muat turun fail PDF yang ditukar pada telefon bimbit.

Ia tidak mudah untuk menukar XML ke PDF secara langsung pada telefon anda, tetapi ia boleh dicapai dengan bantuan perkhidmatan awan. Adalah disyorkan untuk menggunakan aplikasi mudah alih ringan untuk memuat naik fail XML dan menerima PDF yang dihasilkan, dan menukarnya dengan API awan. API awan menggunakan perkhidmatan pengkomputeran tanpa pelayan, dan memilih platform yang betul adalah penting. Kerumitan, pengendalian kesilapan, keselamatan, dan strategi pengoptimuman perlu dipertimbangkan ketika mengendalikan penjanaan XML dan penjanaan PDF. Seluruh proses memerlukan aplikasi front-end dan API back-end untuk bekerjasama, dan ia memerlukan pemahaman tentang pelbagai teknologi.

Untuk fail XML kecil, anda boleh menggantikan kandungan anotasi secara langsung dengan editor teks; Untuk fail besar, adalah disyorkan untuk menggunakan parser XML untuk mengubahnya untuk memastikan kecekapan dan ketepatan. Berhati -hati apabila memadam komen XML, menyimpan komen biasanya membantu pemahaman dan penyelenggaraan kod. Petua Lanjutan menyediakan kod sampel Python untuk mengubahsuai komen menggunakan parser XML, tetapi pelaksanaan khusus perlu diselaraskan mengikut perpustakaan XML yang digunakan. Beri perhatian kepada isu pengekodan semasa mengubah suai fail XML. Adalah disyorkan untuk menggunakan pengekodan UTF-8 dan menentukan format pengekodan.
