Python 连接数据库

sqlite3

import sqlite3
# 创建数据库连接
conn = sqlite3.connect("wucai.db")
# 获取游标
cur = conn.cursor()
# 创建数据表
cur.execute("CREATE TABLE IF NOT EXISTS heros (id int primary key, name text, hp_max real, mp_max real, role_main text)")
# 插入英雄数据
cur.executemany('insert into heros values(?, ?, ?, ?, ?)',
                ((10000, '夏侯惇', 7350, 1746, '坦克'),
                 (10001, '钟无艳', 7000, 1760, '战士'),
                 (10002, '张飞', 8341, 100, '坦克'),
                 (10003, '牛魔', 8476, 1926, '坦克'),
                 (10004, '吕布', 7344, 0, '战士')))
cur.execute("SELECT id, name, hp_max, mp_max, role_main FROM heros")
result = cur.fetchall()
print(result)
# 提交事务
conn.commit()
# 关闭游标
cur.close()
# 关闭数据库连接
conn.close()

'''
SELECT 
SUM((CASE WHEN Age IS NULL THEN 1 ELSE 0 END)) AS age_null_num, 
SUM((CASE WHEN Cabin IS NULL THEN 1 ELSE 0 END)) AS cabin_null_num
FROM titanic_train
'''


Pymysql

import pymysql
import json

# 打开数据库连接
db = pymysql.connect("localhost","root","123456","his" )

# 使用cursor()方法获取操作游标
cursor = db.cursor()

# SQL 插入语句
sql = """SELECT * FROM doctor limit 10"""
try:
    # 执行sql语句
    rnum=cursor.execute(sql)

    results = cursor.fetchall()
    # 提交到数据库执行
    db.commit()
except:
    # 如果发生错误则回滚
    db.rollback()

# 关闭数据库连接
db.close()

print("共有",rnum,"行",sep='')
for res in results:
    print(json.dumps(res,ensure_ascii=False))



SQLAlchemy

SQLAlchemy是一个ORM框架。

# 导入:
from sqlalchemy import Column, String, create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Integer
# 创建对象的基类:
Base = declarative_base()

# 定义User对象:
class HEROS(Base):
    # 表的名字:
    __tablename__ = 'heros'

    # 表的结构:
    id = Column(Integer, primary_key=True)
    name = Column(String(20))
    hp_max=Column(Integer())
    mp_max=Column(Integer())
    role_main=Column(String(255))

# 初始化数据库连接:
engine = create_engine('sqlite:///wucai.db')
# 创建DBSession类型:
DBSession = sessionmaker(bind=engine)

# 创建session对象:
session = DBSession()

#one()返回一行
doctors = session.query(HEROS).filter(HEROS.id>=10000).all()

''' query:
SELECT heros.id AS heros_id, heros.name AS heros_name, heros.hp_max AS heros_hp_max, heros.mp_max AS heros_mp_max, heros.role_main AS heros_role_main 
FROM heros 
WHERE heros.name >= ?
'''

print("共有",len(doctors),"行",sep='')
for doctor in doctors:
    print(doctor.__dict__)


# 提交即保存到数据库:
session.commit()
# 关闭session:
session.close()
可见,ORM就是把数据库表的行与相应的对象建立关联,互相转换。

由于关系数据库的多个表还可以用外键实现一对多、多对多等关联,相应地,ORM框架也可以提供两个对象之间的一对多、多对多等功能。

例如,如果一个User拥有多个Book,就可以定义一对多关系如下:

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'))

当我们查询一个User对象时,该对象的books属性将返回一个包含若干个Book对象的list。
原文地址:https://www.cnblogs.com/cgl-dong/p/14143005.html