首頁 >後端開發 >Python教學 >python 操作sql

python 操作sql

高洛峰
高洛峰原創
2016-12-02 17:10:384411瀏覽

pymsql是Python中操作MySQL的模組,其使用方法和MySQLdb幾乎相同

一、下載安裝

pip3 install pymysql

二、作業使用

資料、建立新1、執行新資料、建立新自增ID

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import pymysql
  
# 创建连接
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123', db='t1')
# 创建游标
cursor = conn.cursor()
  
# 执行SQL,并返回收影响行数
effect_row = cursor.execute("update hosts set host = '1.1.1.2'")
  
# 执行SQL,并返回受影响行数
#effect_row = cursor.execute("update hosts set host = '1.1.1.2' where nid > %s", (1,))
  
# 执行SQL,并返回受影响行数
#effect_row = cursor.executemany("insert into hosts(host,color_id)values(%s,%s)", [("1.1.1.11",1),("1.1.1.11",2)])
  
  
# 提交,不然无法保存新建或者修改的数据
conn.commit()
  
# 关闭游标
cursor.close()
# 关闭连接
conn.close()

3、取得查詢資料

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import pymysql
  
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123', db='t1')
cursor = conn.cursor()
cursor.executemany("insert into hosts(host,color_id)values(%s,%s)", [("1.1.1.11",1),("1.1.1.11",2)])
conn.commit()
cursor.close()
conn.close()
  
# 获取最新自增ID
new_id = cursor.lastrowid

註:在fetch資料時依照順序進行,可以使用cursor.scroll(num,mode)來移動遊標位置,如:

cursor.scroll(1,mode ='relative')  # 相對目前位置移動

cursor.scroll(2,mode='absolute') # 相對絕對位置移動

4、fetch資料型別關於預設取得的資料是元祖類型,如果想要或字典類型的數據,即:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import pymysql
  
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123', db='t1')
cursor = conn.cursor()
cursor.execute("select * from hosts")
  
# 获取第一行数据
row_1 = cursor.fetchone()
  
# 获取前n行数据
# row_2 = cursor.fetchmany(3)
# 获取所有数据
# row_3 = cursor.fetchall()
  
conn.commit()
cursor.close()
conn.close()

SQLAlchemy

SQLAlchemy是Python程式語言下的一款ORM框架,該框架建立在資料庫API之上,使用關聯式物件映射進行資料庫操作,簡言之便是:將物件轉換成SQL,然後使用資料API執行SQL並取得執行結果。

安裝:

pip3 install SQLAlchemy


SQLAlchemy本身無法操作資料庫,其必須以來pymsql等第三方插件,Dialect用於和資料API進行交流,根據配置文件的不同的資料庫API從而實現對資料庫的操作,如:python 操作sql

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import pymysql
  
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123', db='t1')
  
# 游标设置为字典类型
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
r = cursor.execute("call p1()")
  
result = cursor.fetchone()
  
conn.commit()
cursor.close()
conn.close()

一、內部處理

使用Engine/ConnectionPooling/Dialect 進行資料庫操作,Engine使用ConnectionPooling連接資料庫,然後再透過Dialect執行SQL語句。

MySQL-Python
    mysql+mysqldb://<user>:<password>@<host>[:<port>]/<dbname>
   
pymysql
    mysql+pymysql://<username>:<password>@<host>/<dbname>[?<options>]
   
MySQL-Connector
    mysql+mysqlconnector://<user>:<password>@<host>[:<port>]/<dbname>
   
cx_Oracle
    oracle+cx_oracle://user:pass@host:port/dbname[?key=value&key=value...]

二、ORM功能使用

使用 ORM/Schema Type/SQL Expression Language/Engine/ConnectionPooling/Dialect 所有元件對資料進行操作。根據類別建立對象,對象轉換成SQL,執行SQL。

1、建立表

#!/usr/bin/env python
# -*- coding:utf-8 -*-
from sqlalchemy import create_engine
  
  
engine = create_engine("mysql+pymysql://root:123@127.0.0.1:3306/t1", max_overflow=5)
  
# 执行SQL
# cur = engine.execute(
#     "INSERT INTO hosts (host, color_id) VALUES (&#39;1.1.1.22&#39;, 3)"
# )
  
# 新插入行自增ID
# cur.lastrowid
  
# 执行SQL
# cur = engine.execute(
#     "INSERT INTO hosts (host, color_id) VALUES(%s, %s)",[(&#39;1.1.1.22&#39;, 3),(&#39;1.1.1.221&#39;, 3),]
# )
  
  
# 执行SQL
# cur = engine.execute(
#     "INSERT INTO hosts (host, color_id) VALUES (%(host)s, %(color_id)s)",
#     host=&#39;1.1.1.99&#39;, color_id=3
# )
  
# 执行SQL
# cur = engine.execute(&#39;select * from hosts&#39;)
# 获取第一行数据
# cur.fetchone()
# 获取第n行数据
# cur.fetchmany(3)
# 获取所有数据
# cur.fetchall()

2、操作表

#!/usr/bin/env python
# -*- coding:utf-8 -*-
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index
from sqlalchemy.orm import sessionmaker, relationship
from sqlalchemy import create_engine
 
engine = create_engine("mysql+pymysql://root:123@127.0.0.1:3306/t1", max_overflow=5)
 
Base = declarative_base()
 
# 创建单表
class Users(Base):
    __tablename__ = &#39;users&#39;
    id = Column(Integer, primary_key=True)
    name = Column(String(32))
    extra = Column(String(16))
 
    __table_args__ = (
    UniqueConstraint(&#39;id&#39;, &#39;name&#39;, name=&#39;uix_id_name&#39;),
        Index(&#39;ix_id_name&#39;, &#39;name&#39;, &#39;extra&#39;),
    )
 
 
# 一对多
class Favor(Base):
    __tablename__ = &#39;favor&#39;
    nid = Column(Integer, primary_key=True)
    caption = Column(String(50), default=&#39;red&#39;, unique=True)
 
 
class Person(Base):
    __tablename__ = &#39;person&#39;
    nid = Column(Integer, primary_key=True)
    name = Column(String(32), index=True, nullable=True)
    favor_id = Column(Integer, ForeignKey("favor.nid"))
 
 
# 多对多
class Group(Base):
    __tablename__ = &#39;group&#39;
    id = Column(Integer, primary_key=True)
    name = Column(String(64), unique=True, nullable=False)
    port = Column(Integer, default=22)
 
 
class Server(Base):
    __tablename__ = &#39;server&#39;
 
    id = Column(Integer, primary_key=True, autoincrement=True)
    hostname = Column(String(64), unique=True, nullable=False)
 
 
class ServerToGroup(Base):
    __tablename__ = &#39;servertogroup&#39;
    nid = Column(Integer, primary_key=True, autoincrement=True)
    server_id = Column(Integer, ForeignKey(&#39;server.id&#39;))
    group_id = Column(Integer, ForeignKey(&#39;group.id&#39;))
 
 
def init_db():
    Base.metadata.create_all(engine)
 
 
def drop_db():
    Base.metadata.drop_all(engine)
注:设置外检的另一种方式 ForeignKeyConstraint([&#39;other_id&#39;], [&#39;othertable.other_id&#39;])
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index
from sqlalchemy.orm import sessionmaker, relationship
from sqlalchemy import create_engine

engine = create_engine("mysql+pymysql://root:123@127.0.0.1:3306/t1", max_overflow=5)

Base = declarative_base()

# 创建单表
class Users(Base):
    __tablename__ = &#39;users&#39;
    id = Column(Integer, primary_key=True)
    name = Column(String(32))
    extra = Column(String(16))

    __table_args__ = (
    UniqueConstraint(&#39;id&#39;, &#39;name&#39;, name=&#39;uix_id_name&#39;),
        Index(&#39;ix_id_name&#39;, &#39;name&#39;, &#39;extra&#39;),
    )

    def __repr__(self):
        return "%s-%s" %(self.id, self.name)

# 一对多
class Favor(Base):
    __tablename__ = &#39;favor&#39;
    nid = Column(Integer, primary_key=True)
    caption = Column(String(50), default=&#39;red&#39;, unique=True)

    def __repr__(self):
        return "%s-%s" %(self.nid, self.caption)

class Person(Base):
    __tablename__ = &#39;person&#39;
    nid = Column(Integer, primary_key=True)
    name = Column(String(32), index=True, nullable=True)
    favor_id = Column(Integer, ForeignKey("favor.nid"))
    # 与生成表结构无关,仅用于查询方便
    favor = relationship("Favor", backref=&#39;pers&#39;)

# 多对多
class ServerToGroup(Base):
    __tablename__ = &#39;servertogroup&#39;
    nid = Column(Integer, primary_key=True, autoincrement=True)
    server_id = Column(Integer, ForeignKey(&#39;server.id&#39;))
    group_id = Column(Integer, ForeignKey(&#39;group.id&#39;))
    group = relationship("Group", backref=&#39;s2g&#39;)
    server = relationship("Server", backref=&#39;s2g&#39;)

class Group(Base):
    __tablename__ = &#39;group&#39;
    id = Column(Integer, primary_key=True)
    name = Column(String(64), unique=True, nullable=False)
    port = Column(Integer, default=22)
    # group = relationship(&#39;Group&#39;,secondary=ServerToGroup,backref=&#39;host_list&#39;)


class Server(Base):
    __tablename__ = &#39;server&#39;

    id = Column(Integer, primary_key=True, autoincrement=True)
    hostname = Column(String(64), unique=True, nullable=False)




def init_db():
    Base.metadata.create_all(engine)


def drop_db():
    Base.metadata.drop_all(engine)


Session = sessionmaker(bind=engine)
session = Session()
obj = Users(name="alex0", extra=&#39;sb&#39;)
session.add(obj)
session.add_all([
    Users(name="alex1", extra=&#39;sb&#39;),
    Users(name="alex2", extra=&#39;sb&#39;),
])
session.commit()
 session.query(Users).filter(Users.id > 2).delete()
 session.commit()
session.query(Users).filter(Users.id > 2).update({"name" : "099"})
session.query(Users).filter(Users.id > 2).update({Users.name: Users.name + "099"}, synchronize_session=False)
session.query(Users).filter(Users.id > 2).update({"num": Users.num + 1}, synchronize_session="evaluate")
session.commit()
 ret = session.query(Users).all()
 ret = session.query(Users.name, Users.extra).all()
 ret = session.query(Users).filter_by(name=&#39;alex&#39;).all()
 ret = session.query(Users).filter_by(name=&#39;alex&#39;).first()

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn