python 指南(16)数据库交互

使用SQLite

一、关于 SQLite

  • SQLite是一种嵌入式数据库,它的数据库就是一个文件
  • SQLite本身是C写的,而且体积很小,经常被集成到各种应用程序中
  • Python就内置了SQLite3,所以可以直接使用,无需单独安装,也不需要专门的数据库驱动

二、使用 SQLite

1、使用前须知

  • 要操作关系数据库,首先需要连接到数据库,一个数据库连接称为Connection
  • 连接到数据库后,需要打开游标Cursor,通过Cursor执行SQL语句获得执行结果

2、使用细节

>>> import sqlite3
>>> conn= sqlite3.connect('test.db')
>>> cursor = conn.cursor()
>>> cursor.execute('create table user_test(id varchar(20) primary key,name varchar(20))')
<sqlite3.Cursor object at 0x000000000294C2D0>
>>> cursor.execute('insert into user_test values (\'1\',\'allen\')')
<sqlite3.Cursor object at 0x000000000294C2D0>
>>> cursor.rowcount
1
>>> cursor.execute('select * from user_test')
<sqlite3.Cursor object at 0x000000000294C2D0>
>>> cursor.fetchall()
[('1', 'allen')]
>>> cursor.execute('select * from user_test where id=?', ('1',))
<sqlite3.Cursor object at 0x000000000294C2D0>
>>> cursor.fetchall()
[('1', 'allen')]
>>> cursor.close()
>>> conn.commit()
>>> conn.close()

使用Mysql

一、安装配置

  • mysql 的安装配置(略)
  • mysql 驱动安装(windows),直接cmd里面运行
    pip install mysql-connector-python
  • 使用还要检查一下 mysql 的数据引擎和编码
show variables like '%char%';
show variables like '%engine%';

在这里插入图片描述
在这里插入图片描述

二、使用示例

  • 基本和 sqlite 是一样的,就是需要导入驱动而已
>>> import mysql.connector
>>> conn = mysql.connector.connect(user='root',password='root',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
'])
>>> cursor.rowcount
1
>>> conn.commit()
>>> cursor.close()
True
>>> cursor = conn.cursor()
>>> cursor.execute('select * from user where id = %s',('1',))
>>> cursor.fetchall()
[('1', 'Michael')]
>>> cursor.close()
True
>>> conn.close()

使用SQLAlchemy

  • SQLAlchemy 就是一个ORM框架
  • ORM技术就是把关系数据库的表结构映射到对象上
  • 使用前先安装:pip install sqlalchemy

1、基本使用

  • 基本来说就是把以前用sql在数据库中进行数据的操作转换为了对相应的对象的操作
  • declarative_base 是生成一个数据库表对应类型的基类
  • sessionmaker 方法和 engine 绑定生成一个会话对应的类
from sqlalchemy import Column, String, create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base

base = declarative_base()


class User(base):
    __tablename__ = 'user'
    id = Column(String(20), primary_key=True)
    name = Column(String(20))


engine = create_engine('mysql+mysqlconnector://root:root@localhost:3306/test')
Session = sessionmaker(bind=engine)

################# 数据的插入 #####################
# session = Session()
# user1 = User(id='12', name="stan")
# session.add(user1)
# session.commit()
# session.close()

################# 数据的查询 #####################
session = Session()
user = session.query(User).filter(User.id == '12').one()
print(type(user))
print(user.name)
session.close()

2、多表关联

  • 这里面用户和书是一对多的关系,多方建立外键指向一方的主键
  • 两个表的创建脚本如下
CREATE TABLE `book` (
  `id` varchar(20) NOT NULL,
  `name` varchar(20) DEFAULT NULL,
  `user_id` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `fk_uid` (`user_id`),
  CONSTRAINT `fk_uid` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8$$

CREATE TABLE `user` (
  `id` varchar(20) NOT NULL,
  `name` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8$$
  • python测试代码如下
from sqlalchemy import Column, String, create_engine, ForeignKey
from sqlalchemy.orm import sessionmaker, relationship
from sqlalchemy.ext.declarative import declarative_base

base = declarative_base()


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))
    user_id = Column(String(20), ForeignKey('user.id'))


engine = create_engine('mysql+mysqlconnector://root:root@localhost:3306/test')
Session = sessionmaker(bind=engine)

session = Session()
user2 = session.query(User).filter(User.id == '12').one()
print(user2.name)
for book in user2.books:
    print(book.name)
session.close()


操作sqlserver

import pymssql 
import config
server = server1
user = user1
password = password1
conn = pymssql.connect(server, user, password, database1)  #获取连接
cursor = conn.cursor() # 获取光标
 
 
####创建表
cursor.execute("""
IF OBJECT_ID('persons', 'U') IS NOT NULL
    DROP TABLE persons
CREATE TABLE persons (
    id INT NOT NULL,
    name VARCHAR(100),
    salesrep VARCHAR(100),
    PRIMARY KEY(id)
)
""")
 
 
####批量插入数据
cursor.executemany(
    "INSERT INTO persons VALUES (%d, %s, %s)",
    [(1, 'John Smith', 'John Doe'),
     (2, 'Jane Doe', 'Joe Dog'),
     (3, 'Mike T.', 'Sarah H.')])
conn.commit()
 
 
####删除数据
cursor.execute(
    "delete from persons where id=2"
    )
conn.commit()
 
 
# 查询数据并遍历,结果默认存放到元组之中,要存到字典,需修改cursor = conn.cursor(as_dict=True)
cursor.execute('SELECT * FROM persons WHERE id={0}'.format(3))
row = cursor.fetchone()
while row:
    print(row)
    row = cursor.fetchone()
 
 
####更改数据
cursor.execute(
    "update persons set name ='haha' where id=1"
    )
conn.commit()
 
 
####创建存储过程
cursor.execute("""
        CREATE PROCEDURE FindPerson
            @name VARCHAR(100)
        AS BEGIN
            SELECT * FROM persons WHERE name = @name
        END
        """)
 
 
#####调用存储过程
cursor.callproc('FindPerson', ('haha',))
for row in cursor:
    print(row)
 
 
####执行含聚合函数的语句
cursor.execute('SELECT COUNT(*) FROM persons')
for row in cursor:
    print(row[0])
 
 
conn.close()#手动关闭连接
 
 
#####用with实现自动关闭conn
with pymssql.connect("", "", "", "") as conn:
    with conn.cursor(as_dict=True) as cursor:   # 数据存放到字典中
        cursor.execute('SELECT * FROM persons WHERE salesrep=%s', 'John Doe')
        for row in cursor:
            print(row)
发布了153 篇原创文章 · 获赞 51 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/stanwuc/article/details/103807961
今日推荐