1、MySQL数据库
MySQL是世界上最流行的开源数据库。无论是快速增长的web属性、技术ISV还是大型企业,MySQL都可以经济有效地交付高性能、可扩展的数据库应用程序。MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。另外,MySQL性能卓越、服务稳定,很少出现异常宕机。MySQL开放源代码且无版权制约,自主性及使用成本低。MySQL体积小,安装方便,易于维护。MySQL支持多种操作软件,提供多种API接口,支持多种开发语言。
2、安装Pony和MySQL驱动
Pony会尝试使用MySQLdb驱动来处理MySQL。如果这个模块不能import,Pony会尝试使用pymysql。pymysql是由yutaka.matsubara开发维护的纯python实现的mysql模块。它相对于mysql.connector, MYSQLdb来说比较年轻。它的效率和可移植性和my-connector理论上是差不多的。MySQLdb是一个围绕_mysql简化的Python包装器,它使_mysql与Python DB API接口兼容(v2.0)。其中_mysql也是该作者开发的模块,它依赖C库,则MYSQLdb也是依赖C库的,可移植性不太好。MysqlClient 是 Python 操作 MySql 的一个驱动程序,是 MySQL-python 的另外一个分支,目前MySQL-python 只支持到Python2,而 MysqlClient 支持 Python3 并且修复了一些bug。
1)使用pip安装Pony
pip install pony
2)安装数据库的驱动
参考文档:Python 使用mysql.connector、pymysql和 MYSQLdb(MysqlClient)操作MySQL数据库
3、Pony MySQL常用操作
使用Pony ORM操作MySQL进行数据增加、删除、修改和查询,示例代码如下,
from decimal import Decimal from pony.orm import * db = Database() db.bind(provider='mysql', host='localhost', user='root', passwd='yourpasswd', db='db') class Customer(db.Entity): id = PrimaryKey(int, auto=True) name = Required(str) email = Required(str, unique=True) orders = Set("OrderInfo") class OrderInfo(db.Entity): id = PrimaryKey(int, auto=True) total_price = Required(Decimal) customer = Required(Customer) items = Set("OrderItem") class Product(db.Entity): id = PrimaryKey(int, auto=True) name = Required(str) price = Required(Decimal) items = Set("OrderItem") class OrderItem(db.Entity): quantity = Required(int, default=1) order = Required(OrderInfo) product = Required(Product) PrimaryKey(order, product) sql_debug(True) db.generate_mapping(create_tables=True) @db_session def populate_database(): c1 = Customer(name='John Smith', email='john@example.com') c2 = Customer(name='Matthew Reed', email='matthew@example.com') c3 = Customer(name='Chuan Qin', email='chuanqin@example.com') c4 = Customer(name='Rebecca Lawson', email='rebecca@example.com') c5 = Customer(name='Oliver Blakey', email='oliver@example.com') p1 = Product(name='Kindle Fire HD', price=Decimal('284.00')) p2 = Product(name='Apple iPad with Retina Display', price=Decimal('478.50')) p3 = Product(name='SanDisk Cruzer 16 GB USB Flash Drive', price=Decimal('9.99')) p4 = Product(name='Kingston DataTraveler 16GB USB 2.0', price=Decimal('9.98')) p5 = Product(name='Samsung 840 Series 120GB SATA III SSD', price=Decimal('98.95')) p6 = Product(name='Crucial m4 256GB SSD SATA 6Gb/s', price=Decimal('188.67')) o1 = OrderInfo(customer=c1, total_price=Decimal('292.00')) OrderItem(order=o1, product=p1) OrderItem(order=o1, product=p4, quantity=2) o2 = OrderInfo(customer=c1, total_price=Decimal('478.50')) OrderItem(order=o2, product=p2) o3 = OrderInfo(customer=c2, total_price=Decimal('680.50')) OrderItem(order=o3, product=p2) OrderItem(order=o3, product=p4, quantity=2) OrderItem(order=o3, product=p6) o4 = OrderInfo(customer=c3, total_price=Decimal('99.80')) OrderItem(order=o4, product=p4, quantity=10) o5 = OrderInfo(customer=c4, total_price=Decimal('722.00')) OrderItem(order=o5, product=p1) OrderItem(order=o5, product=p2) commit() populate_database() #查询 @db_session def query(): print(select(p for p in Product if p.id==3)[:]) #多条数据会报错:pony.orm.core.MultipleObjectsFoundError: Multiple objects were found. Use Customer.select(...) to retrieve them #通过pk获取 print(Product[1].name) print(Customer.get(id=1).name) print(Customer.select(lambda c: c.id==1)[:][0].name) y = 1 print(Product.select_by_sql("SELECT * FROM Product WHERE id=$(y*2)")[0].name) @db_session def update(): c1 = Customer.get(id=1) c1.name="john" p1 = select(p for p in Product if p.id==3)[:][0] p1.name="cjavapy" c2 = Customer.get(id=2) #更新多个字段 #c.name="cjavapy" #c.email="cjavapy@gmail.com" c2.set(name="cjavapy",email="cjavapy@gmail.com") @db_session def delete(): p = Product[1] p.delete() # 或者: #delete(p for p in Product if p.id >=5) # 或: #使用bulk=True参数是一条delete语句批量删除,否则是先select满足条件数据,然后每次删除一个 Product.select(lambda p: p.id >=5).delete(bulk=True) query() update() delete()