koneksi database MySQL Python3
Dalam tulisan ini, kami memperkenalkan Python3 penggunaan PyMySQL terhubung ke database, dan CRUD sederhana.
Apa PyMySQL?
PyMySQL untuk koneksi database MySQL versi server di Python3.x, python2 digunakan mysqldb.
PyMySQL ikuti Python database API v2.0 spesifikasi dan berisi client library MySQL-Python murni.
instalasi PyMySQL
Sebelum menggunakan PyMySQL, kita perlu memastikan PyMySQL diinstal.
PyMySQL Download: https: //github.com/PyMySQL/PyMySQL.
Jika belum terinstal, kita dapat menggunakan perintah berikut untuk menginstal versi terbaru dari PyMySQL:
$ pip install PyMySQL
Jika sistem Anda tidak mendukung perintah pip, Anda dapat menggunakan berikut diinstal:
1, menggunakan perintah git untuk men-download paket instalasi (Anda juga dapat secara manual men-download):
$ git clone https://github.com/PyMySQL/PyMySQL $ cd PyMySQL/ $ python3 setup.py install
2, jika Anda perlu untuk mengembangkan nomor versi, Anda dapat menggunakan perintah curl untuk menginstal:
$ # X.X 为 PyMySQL 的版本号 $ curl -L https://github.com/PyMySQL/PyMySQL/tarball/pymysql-X.X | tar xz $ cd PyMySQL* $ python3 setup.py install $ # 现在你可以删除 PyMySQL* 目录
Catatan: Pastikan Anda memiliki hak akses root untuk menginstal modul yang dijelaskan di atas.
Proses instalasi mungkin muncul "ImportError: Tidak ada modul bernama setuptools" pesan kesalahan, yang berarti Anda tidak perlu menginstal setuptools, Anda dapat mengakses https://pypi.python.org/pypi/setuptools menemukan metode instalasi masing-masing sistem.
instalasi Linux Contoh:
$ wget https://bootstrap.pypa.io/ez_setup.py $ python3 ez_setup.py
database Connectivity
Sebelum menghubungkan ke database, pastikan item berikut:
- Anda telah membuat testdb basis data.
- Dalam database testdb Anda telah membuat tabel EMPLOYEE
- KARYAWAN bidang meja FIRST_NAME, LAST_NAME, AGE, SEX dan PENGHASILAN.
- Pengguna terhubung ke database menggunakan testdb bernama "testuser", password "test123", Anda dapat mengatur sendiri langsung atau akar nama pengguna dan password Anda, lisensi database pengguna Mysql, silakan gunakan perintah Grant.
- Pada mesin Anda sudah terinstal modul Python MySQLdb.
- Jika Anda tidak akrab dengan pernyataan sql, Anda dapat mengunjungi kami secara SQL tutorial
contoh:
Contoh-contoh berikut link database testdb Mysql:
#!/usr/bin/python3 import pymysql # 打开数据库连接 db = pymysql.connect("localhost","testuser","test123","TESTDB" ) # 使用 cursor() 方法创建一个游标对象 cursor cursor = db.cursor() # 使用 execute() 方法执行 SQL 查询 cursor.execute("SELECT VERSION()") # 使用 fetchone() 方法获取单条数据. data = cursor.fetchone() print ("Database version : %s " % data) # 关闭数据库连接 db.close()
Pelaksanaan script di atas output hasil adalah sebagai berikut:
Database version : 5.5.20-log
Membuat tabel database
Jika koneksi database ada, kita dapat menggunakan metode mengeksekusi () untuk membuat tabel untuk database, membuat KARYAWAN meja ditampilkan sebagai berikut:
#!/usr/bin/python3 import pymysql # 打开数据库连接 db = pymysql.connect("localhost","testuser","test123","TESTDB" ) # 使用 cursor() 方法创建一个游标对象 cursor cursor = db.cursor() # 使用 execute() 方法执行 SQL,如果表存在则删除 cursor.execute("DROP TABLE IF EXISTS EMPLOYEE") # 使用预处理语句创建表 sql = """CREATE TABLE EMPLOYEE ( FIRST_NAME CHAR(20) NOT NULL, LAST_NAME CHAR(20), AGE INT, SEX CHAR(1), INCOME FLOAT )""" cursor.execute(sql) # 关闭数据库连接 db.close()
database insert
Contoh berikut menggunakan mengeksekusi pernyataan SQL INSERT untuk memasukkan catatan ke KARYAWAN meja:
#!/usr/bin/python3 import pymysql # 打开数据库连接 db = pymysql.connect("localhost","testuser","test123","TESTDB" ) # 使用cursor()方法获取操作游标 cursor = db.cursor() # SQL 插入语句 sql = """INSERT INTO EMPLOYEE(FIRST_NAME, LAST_NAME, AGE, SEX, INCOME) VALUES ('Mac', 'Mohan', 20, 'M', 2000)""" try: # 执行sql语句 cursor.execute(sql) # 提交到数据库执行 db.commit() except: # 如果发生错误则回滚 db.rollback() # 关闭数据库连接 db.close()
Contoh di atas juga dapat ditulis sebagai berikut:
#!/usr/bin/python3 import pymysql # 打开数据库连接 db = pymysql.connect("localhost","testuser","test123","TESTDB" ) # 使用cursor()方法获取操作游标 cursor = db.cursor() # SQL 插入语句 sql = "INSERT INTO EMPLOYEE(FIRST_NAME, \ LAST_NAME, AGE, SEX, INCOME) \ VALUES ('%s', '%s', '%d', '%c', '%d' )" % \ ('Mac', 'Mohan', 20, 'M', 2000) try: # 执行sql语句 cursor.execute(sql) # 执行sql语句 db.commit() except: # 发生错误时回滚 db.rollback() # 关闭数据库连接 db.close()
Kode berikut menggunakan variabel untuk melewatkan parameter ke sebuah pernyataan SQL:
.................................. user_id = "test123" password = "password" con.execute('insert into Login values("%s", "%s")' % \ (user_id, password)) ..................................
query database
Python Mysql query menggunakan metode fetchone () untuk mendapatkan data tunggal menggunakan fetchAll metode () untuk mendapatkan sejumlah data.
- fetchone (): Metode ini mendapat berikutnya hasil query set.Set hasil target
- fetchAll (): mengembalikan hasilnya untuk menerima semua baris.
- rowcount: Ini adalah atribut read-only, dan mengembalikan eksekusi melaksanakan metode () setelah jumlah baris yang dipengaruhi.
contoh:
Pilihan KARYAWAN meja gaji (upah) data lapangan lebih besar dari semua 1000:
#!/usr/bin/python3 import pymysql # 打开数据库连接 db = pymysql.connect("localhost","testuser","test123","TESTDB" ) # 使用cursor()方法获取操作游标 cursor = db.cursor() # SQL 查询语句 sql = "SELECT * FROM EMPLOYEE \ WHERE INCOME > '%d'" % (1000) try: # 执行SQL语句 cursor.execute(sql) # 获取所有记录列表 results = cursor.fetchall() for row in results: fname = row[0] lname = row[1] age = row[2] sex = row[3] income = row[4] # 打印结果 print ("fname=%s,lname=%s,age=%d,sex=%s,income=%d" % \ (fname, lname, age, sex, income )) except: print ("Error: unable to fecth data") # 关闭数据库连接 db.close()
Hasil eksekusi script di atas adalah sebagai berikut:
fname=Mac, lname=Mohan, age=20, sex=M, income=2000
update database
Data memperbarui operasi untuk memperbarui tabel data, contoh berikut akan testdb bidang SEX meja semua perubahan 'M', bidang AGE nilainya 1:
#!/usr/bin/python3 import pymysql # 打开数据库连接 db = pymysql.connect("localhost","testuser","test123","TESTDB" ) # 使用cursor()方法获取操作游标 cursor = db.cursor() # SQL 更新语句 sql = "UPDATE EMPLOYEE SET AGE = AGE + 1 WHERE SEX = '%c'" % ('M') try: # 执行SQL语句 cursor.execute(sql) # 提交到数据库执行 db.commit() except: # 发生错误时回滚 db.rollback() # 关闭数据库连接 db.close()
penghapusan
Menghapus data menghapus data untuk meja, contoh berikut menunjukkan menghapus data dalam tabel EMPLOYEE lebih besar dari semua AGE Data 20:
#!/usr/bin/python3 import pymysql # 打开数据库连接 db = pymysql.connect("localhost","testuser","test123","TESTDB" ) # 使用cursor()方法获取操作游标 cursor = db.cursor() # SQL 删除语句 sql = "DELETE FROM EMPLOYEE WHERE AGE > '%d'" % (20) try: # 执行SQL语句 cursor.execute(sql) # 提交修改 db.commit() except: # 发生错误时回滚 db.rollback() # 关闭连接 db.close()
Urusan eksekutif
mekanisme transaksi untuk memastikan konsistensi data.
Jasa harus memiliki empat sifat: atomicity, konsistensi, isolasi, daya tahan. Keempat sifat sering disebut sebagai sifat ACID.
- Atom (atomicity). Sebuah transaksi adalah unit terpisahkan dari pekerjaan, operasi tersebut termasuk dalam transaksi baik melakukan atau tidak melakukan.
- Konsistensi (konsistensi). Layanan harus diubah untuk membuat database dari satu negara yang konsisten untuk negara yang konsisten lain. Konsistensi dan atomicity yang erat terkait.
- Isolasi (isolasi). Mengeksekusi transaksi tidak bisa transaksi lainnya gangguan. Itu adalah transaksi operasi internal dan penggunaan concurrency data transaksi lainnya terisolasi dan tidak dapat mengganggu satu sama lain antara transaksi individual mengeksekusi secara bersamaan.
- Kegigihan (daya tahan). Persistent juga disebut permanen (permanen), itu berarti bahwa sekali transaksi melakukan, mengubah data dalam database harus permanen. Berikut operasi lain atau kegagalan seharusnya tidak memiliki dampak apapun.
Python DB API 2.0 menyediakan dua metode transaksi melakukan atau rollback.
contoh
# SQL删除记录语句 sql = "DELETE FROM EMPLOYEE WHERE AGE > '%d'" % (20) try: # 执行SQL语句 cursor.execute(sql) # 向数据库提交 db.commit() except: # 发生错误时回滚 db.rollback()
Untuk database transaksional, pemrograman database dengan Python, ketika kursor didirikan, otomatis dimulai transaksi database terlihat.
komit metode () untuk semua metode update kursor, rollback () untuk memutar kembali semua operasi dari kursor saat ini. Setiap metode telah memulai bisnis baru.
Penanganan kesalahan
DB API mendefinisikan sejumlah kesalahan dan operasi abnormal dari database, tabel berikut berisi daftar kesalahan dan pengecualian:
abnormal | deskripsi |
---|---|
peringatan | Ketika ada peringatan serius untuk memicu, seperti memasukkan data terpotong, dan sebagainya. Ini harus menjadi subclass dari StandardError. |
kesalahan | Semua kelas kesalahan lain selain peringatan. Ini harus menjadi subclass dari StandardError. |
InterfaceError | Kebakaran ketika modul antarmuka database memiliki kesalahan sendiri (bukan database error) terjadi. Ini harus menjadi subclass dari Kesalahan. |
DatabaseError | Memicu dan kesalahan yang berhubungan dengan database. Ini harus menjadi subclass dari Kesalahan. |
DataError | Ketika ada terjadi kesalahan pengolahan data bila dipicu, misalnya: membagi dengan nol kesalahan, data dari jangkauan, dan sebagainya. Ini harus menjadi subclass dari DatabaseError. |
OperationalError | Hal ini mengacu pada non-pengguna dikontrol, tapi kesalahan terjadi saat database. Sebagai contoh: sengaja terputus, nama database tidak ditemukan, transaksi gagal, kesalahan alokasi memori, terjadi dll operasi database error. Ini harus menjadi subclass dari DatabaseError. |
IntegrityError | Terkait integritas kesalahan, seperti cek kunci asing gagal dan sejenisnya. Itu harus DatabaseError subclass. |
internalerror | error database internal, seperti kursor (kursor) gagal, sinkronisasi transaksi gagal dan sebagainya. Itu harus DatabaseError subclass. |
ProgrammingError | kesalahan prosedural, seperti tabel data (tabel) tidak ditemukan atau sudah ada, pernyataan SQL syntax error, jumlah kesalahan parameter, dan sebagainya. Ini harus menjadi subclass dari DatabaseError. |
NotSupportedError | Tidak didukung error, mengacu pada penggunaan fungsi seperti API atau database tidak mendukung. Misalnya, menggunakan .rollback pada fungsi koneksi objek (), tetapi database tidak mendukung transaksi atau transaksi telah ditutup. Ini harus menjadi subclass dari DatabaseError. |