- 使用數據庫驅動連接數據庫 (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()