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-connectormysql.connector模塊),若失敗,可安裝pip install mysql-connector==2.1.4;或者安裝 pymysql

pip install PyMySqlPyMySql模塊);

  具體連接數據庫以及各種操作與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()

 

   

 

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM