SQLite: 轻量级、可嵌入,但不能承受高并发访问,适合桌面和移动应用
MySQL: 为服务端设计的数据库,能承受高并发
python内置了c写的很小的嵌入式数据库SQLite,使用方法也很简单,因为其数据库就是一个文件,所以获取connection之后,再紧接着获取游标cursor而不是session。
例子,这里为了简化,突出重点,没有使用try...except...finally来关闭conn和cursor
import sqlite3
conn = sqlite3.connect('test.db')
cursor = conn.cursor()
cursor.execute('create table user( id varchar(20) primary key, name varchar(20))')
cursor.execute("insert into user (id, name) values('1', 'Michael')")
print(cursor.rowcount) #影响的行数
cursor.execute('select * from user where id=?', (1,)) #占位符是?
rs = cursor.fetchall() #返回list 一个tuple的list 一条tuple代表表中一行记录
print(rs)
cursor.close()
conn.commit()
conn.close()
Output:
1
[('1', 'Michael')]
可以通过os来操作文件
import os
db_file = os.path.join(os.path.dirname(__file__), 'test.db') #__file__代表当前文件 这里找其目录
if os.path.isfile(db_file): #如果db_file存在 先删除
os.remove(db_file)
需要安装mysql-connector模块
pip install mysql-connector
import mysql.connector
conn = mysql.connector.connect(user='数据库账号', password='数据库密码', database='test')#驱动不同
cursor = conn.cursor()
cursor.execute('create table user (id varchar(20) primary key, name varchar(20))')
cursor.execute('insert into user (id, name) values (%s, %s)', ['1', 'Michael'])
print(cursor.rowcount)
cursor.execute('select * from user where id = %s', ('1',)) #占位符不同是 %s
rs = cursor.fetchall()
print(rs)
conn.commit()
cursor.close()
conn.close()
Output:
1
[('1', 'Michael')]
可以看到,python的API设计的接口很统一,mysql和sqlite的接口一模一样,
另外需要注意的是,mysql编码问题,详见MySQL中文乱码
python的orm框架, 安装sqlalchemy模块
from sqlalchemy import Column, String, create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base() #对象的基类 之前学元类的时候写过一个精简的orm框架 基本道理是一样的
class User(Base):
__tablename__ = 'user' #表名
#字段
id = Column(String(20), primary_key=True)
name = Column(String(20))
engine = create_engine('mysql+mysqlconnector://用户名:密码@localhost:3306/test')
DBSession = sessionmaker(bind=engine)
#以上是 数据库连接和映射配置 和java的hibernate对比以下,一目了然
#以下是 数据库操作部分
session = DBSession() # 创建session对象:
new_user = User(id='5', name='Bob') # 创建新User对象:
session.add(new_user) # 添加到session:
session.commit() # 提交即保存到数据库:
session.close() # 关闭session:
看得出来 orm框架的用法 基本和之前用元类实现的一样,连接在这里metaclass实现orm的原理
然后基本的思想和 java的hibernate是一样的 都是orm框架。
class User(Base):
__tablename__ = 'user'
id = Column(String(20), primary_key=True)
name = Column(String(20))
# 一对多:
books = relationship('Book')
class Book(Base):
__tablename__ = 'book'
id = Column(String(20), primary_key=True)
name = Column(String(20))
# “多”的一方的book表是通过外键关联到user表的:
user_id = Column(String(20), ForeignKey('user.id'))
通过relationship指示关系,然后配合ForeignKey指明外键。