python使用SQLite,MySQL,SQLAlchemy

SQLite: 轻量级、可嵌入,但不能承受高并发访问,适合桌面和移动应用

MySQL: 为服务端设计的数据库,能承受高并发


一,SQLite

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')]
  • 增删改查都是cursor.execute() 在参数中直接写sql语句即可
  • 增删改通过cursor.rowcount获取影响行
  • 查通过cursor.fecthall()获取查询记录

可以通过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

需要安装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的接口一模一样,

  • 唯一不同的就是sql语句中占位符表示的不同

另外需要注意的是,mysql编码问题,详见MySQL中文乱码

三,SQLAlchemy

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指明外键。

猜你喜欢

转载自blog.csdn.net/qq_21294095/article/details/85273233
今日推荐