Python处理数据库
- 使用数据库驱动连接数据库 (Connection对象)
- 打开游标(Cursor对象),并通过它执行SQL语句(execute方法)
- 提交操作(commit())
- 关闭连接(close())
- ORM将表记录映射为对象
1,SQLite
Python内置了SQLite3,查看sqlite3文档
import sqlite3 conn = sqlite3.connect('数据库.db') cur = conn.cursor() # 建表 cur.execute('create table user ' '(id varchar(20) primary key, name varchar(20), password varchar(20))') # 插值 cur.execute('INSERT INTO user values("1","April","1234567890")') # 提交 conn.commit() # 关闭连接 conn.close()
note! 当SQL语句需要使用到Python程序中的变量值时,不要使用Python中字符串操作来组合查询,因为这样容易受到SQL注入攻击。解决方法是使用DB-API的参数替代:用?作为占位符,然后提供 值的元组 作为游标execute()方法的第二个参数。 (其他数据库模块可能使用不同的占位符,例如%s 或:1)。
import sqlite3 conn = sqlite3.connect("数据库.db") cur = conn.cursor() name = 'April' # SQL语句中使用Python程序中的变量时 # Never do this -- insecure! #cur.execute("SELECT * FROM user WHERE name = '%s'" % name) # Do this instead t = ('April',) cur.execute('SELECT * FROM user WHERE name=?', t) print(cur.fetchone()) # 用for循环获取execute()查找返回的结果【还有fetchone()/fetchall()等方法】 for row in cur.execute('select * from user'): print(row) cur.execute('select "name","password" from user where id=?', ('1',)) print(cur.fetchall()) print(cur.rowcount) # rowcount表示上一操作影响的行数,-1表示该游标未执行语句或者接口未确定最后一个操作的行数 try: # Larger example that inserts many records at a time users = [('2', 'A', '0000'), ('3', 'B', '3333'), ('4', 'C', '4444'), ] cur.executemany('INSERT INTO user VALUES (?,?,?)', users) except sqlite3.IntegrityError as e: print('插入失败:',e) finally: conn.commit() conn.close()
2,MySQL
安装:注意设置root密码不要忘记,以后连接数据库时要使用哦
修改MySQL数据库默认数据存储的位置:将 C:\ProgramData\MySQL\MySQL Server 5.7 中 my.ini文件的 " datadir =... " 修改为目标路径,注意ProgramData文件夹是被隐藏的
- 在实验室电脑上安装MySQL时,配置到starting server时卡住了,重装好几次都是这样。 在开始菜单里无法打开MySQL Command Line Client.最后查阅网上资料,解决方法如下:
cmd命令下进入MySQL安装目录(C:\Program Files\MySQL\MySQL Server 5.7\bin),输 入 mysql -u root -p ,出现Enter Password,这时不用输入密码,直接回车便进入了
MySQL数据库。
后来查看安装日志(C:\ProgramData\MySQL\MySQL Installer for Windows\Logs),发现出现 mysql-installer Information: 10 : 2017-10-17T07:07:38.244359Z 1 [Warning]
root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option. 不知是否有关。
更改root密码:set password for root@localhost = password('password');
问题是以后都得这样登录Mysql太繁琐
MySQL语句:http://www.cnblogs.com/picaso/archive/2012/05/17/2505895.html
Python连接Mysql
安装MySQL数据库驱动(MySQL driver) pip install mysql-connector(mysql.connector模块),若失败,可安装pip install mysql-connector==2.1.4;或者安装 pymysql
pip install PyMySql (PyMySql模块);
具体连接数据库以及各种操作与SQLite相似;
https://dev.mysql.com/doc/connector-python/en/connector-python-example-connecting.html
使用mysql.connector:
import mysql.connector from mysql.connector import errorcode conn = mysql.connector.connect(user = 'root',password = 'password', host = '127.0.0.1', database = 'test') cur = conn.cursor() # 建表 try: cur.execute('create table teacher (id varchar(20) primary key, name varchar(20))') except mysql.connector.Error as err: if err.errno == errorcode.ER_TABLE_EXISTS_ERROR: print('already exists!') else: print(err.msg) else: print('建表成功!') cur.close() conn.close()
使用pymysql:
import pymysql conn = pymysql.connect(user = 'root',password = 'password', host = '127.0.0.1', database = 'test') # 建表 try: with conn.cursor() as cur: #相当于cur = conn.cursor 打开游标,不用再去关闭 # Create a new record sql = "INSERT INTO teacher (id, name) VALUES (%s, %s)" cur.execute(sql , ('1', 'EE')) # connection is not autocommit by default. So you must commit to save # your changes. conn.commit() except: pass try: with conn.cursor() as cur: # Read a single record sql = "SELECT id,name FROM teacher WHERE id = %s" cur.execute(sql, ('0',)) result = cur.fetchone() print(result) except: pass finally: conn.close()
3, ORM Object-Relational Mapping,把关系数据库的表结构映射到对象上
ORM框架:把数据库的一行转化为程序中的一个对象,安装SQLAlchemy模块,pip install SQLALchemy
Python的DB-API返回的表数据结构为 一个包含tuple的list,每个tuple表示表的一行记录;ORM就是将这样的一个tuple表示为一个class的实例,将一张表转化为一个类。所以向表中插入一行就相当于添加一个对应的对象。
from sqlalchemy import Column,String,create_engine from sqlalchemy.orm import sessionmaker from sqlalchemy.ext.declarative import declarative_base # 创建对象基类 Base = declarative_base() class Teacher(Base): # 表名 __tablename__ = 'teacher' # 表结构 id = Column(String(20), primary_key=True) name = Column(String(20)) # 初始化数据库连接: engine = create_engine('mysql+mysqlconnector://root:password@localhost:3306/test') # 创建DBSession类型: DBSession = sessionmaker(bind=engine) # 添加记录(把对象添加到session) session = DBSession() # DBSession对象可视为当前数据库连接 new_teacher = Teacher(id= '2', name ='Anna') session.add(new_teacher) session.commit() session.close() # 查询记录 session = DBSession() # 创建Query查询,filter是where条件,最后调用one()返回唯一行,如果调用all()则返回所有行: user = session.query(Teacher).filter(Teacher.id=='2').one() print('type:', type(user)) print('name:', user.name) session.close()