1.首先,我們必須得連上我們的MYSQL數據庫。個人遇到連不上MYSQL數據的問題主要有:數據庫的權限問題、數據庫表權限的問題
同時獲取數據庫中的數據等。
//==========================================================================
數據庫連不上:
授權:
grant all on *.* to 'root'@'youruser' identified by 'yourpassword';
flush privileges;
//==========================================================================
//==========================================================================
//連接數據庫
//==========================================================================
1 import pymysql 2 # 創建連接 相當於創建了一個socket 3 conn = pymysql.connect(host='localhost', port=3306, user='LOCALHOST',password='123456',db='lll') 4 # 創建游標 5 cursor = conn.cursor() 6 7 # 執行SQL,並返回收影響行數 8 effect_row = cursor.execute("select * from student") print(effect_row) 9 print(cursor.fetchone()) 10 print(cursor.fetchone())#獲取一條數據 11 print('====================================') 12 print(cursor.fetchall())#獲取前面沒有獲取到的所有數據 相當於和讀文件一樣
2.插入數據
1 import pymysql 2 # 創建連接 相當於創建了一個socket 3 conn = pymysql.connect(host='localhost', port=3306, user='LOCALHOST',password='123456',db='lll') 4 # 創建游標 5 cursor = conn.cursor() 6 data = [ 7 ("N1","22","2018-5-25"), 8 ("N2","23","2018-5-25"), 9 ("N3","24","2018-5-25") 10 ] 11 cursor.executemany("insert into student(name,age,register_date)values(%s,%s,%s)", data) 12 # 提交,不然無法保存新建或者修改的數據 13 conn.commit() #默認開啟事務的 需要提交 14 //==========================================================================
3.查詢數據
1 //========================================================================== 2 #查詢數據 3 import pymysql 4 # 創建連接 相當於創建了一個socket 5 conn = pymysql.connect(host='localhost', port=3306, user='LOCALHOST',password='123456',db='lll') 6 # 創建游標 7 cursor = conn.cursor() 8 # 獲取第一行數據 9 row_1 = cursor.fetchone() 10 # 獲取前n行數據 11 # row_2 = cursor.fetchmany(3) 12 # 獲取所有數據 13 # row_3 = cursor.fetchall() 14 conn.commit() 15 cursor.close() 16 conn.close() 17 //==========================================================================
4.SQLAchemy
orm英文全稱object relational mapping,就是對象映射關系程序,簡單來說我們類似python這種面向對象的程序來說一切皆對象,但是我們使用的數據庫卻都是關系型的,為了保證一致的使用習慣,通過orm將編程語言的對象模型和數據庫的關系模型建立映射關系,這樣我們在使用編程語言對數據庫進行操作的時候可以直接使用編程語言的對象模型進行操作就可以了,而不用直接使用sql語言。
在Python中,最有名的ORM框架是SQLAlchemy。用戶包括openstack\Dropbox等知名公司或應用,主要用戶列表
創建表:
1 //========================================================================== 2 //SQLAchemy 3 //========================================================================== 4 import sqlalchemy 5 from sqlalchemy import create_engine 6 from sqlalchemy.ext.declarative import declarative_base 7 from sqlalchemy import Column, Integer, String 8 9 engine = create_engine("mysql+pymysql://LOCALHOST:123456@localhost/lll", 10 encoding='utf-8', echo=True)#如果不echo = true 就不打印 11 12 Base = declarative_base() #生成orm基類 13 14 class User(Base): 15 __tablename__ = 'user' #表名 16 id = Column(Integer, primary_key=True) 17 name = Column(String(32)) 18 password = Column(String(64)) 19 20 Base.metadata.create_all(engine) #創建表結構
#===========================================================================
//另一種創建方法不常用的
#===========================================================================
1 #=========================================================================== 2 //另一種創建方法不常用的 3 #=========================================================================== 4 from sqlalchemy import Table, MetaData, Column, Integer, String, ForeignKey 5 from sqlalchemy.orm import mapper 6 metadata = MetaData() 7 8 # 創建一個表 9 user = Table('user', metadata, 10 Column('id', Integer, primary_key=True), 11 Column('name', String(50)), 12 Column('fullname', String(50)), 13 Column('password', String(12)) 14 ) 15 # 一般不用 16 class User(object): 17 def __init__(self, name, fullname, password): 18 self.name = name 19 self.fullname = fullname 20 self.password = password 21 22 mapper(User, user) 23 #the table metadata is created separately with the Table construct, 24 #then associated with the User class via the mapper() function 25 #===========================================================================
#===========================================================================
#最基本的表我們創建好了,那我們開始用orm創建一條數據試試
#===========================================================================
1 #=========================================================================== 2 #最基本的表我們創建好了,那我們開始用orm創建一條數據試試 3 #=========================================================================== 4 from sqlalchemy.orm import sessionmaker 5 # 最基本的表我們創建好了,那我們開始用orm創建一條數據試試 6 Session_class = sessionmaker(bind = engine) #創建與數據庫的會話session class ,注意,這里返回給session的是個class,不是實例 7 Session = Session_class() #生成session實例 8 9 user_obj = User(name="NEOKARL",password="NEOKarl") #生成你要創建的數據對象 10 user_obj2 = User(name="NEOKARL2",password="NEOKarl2") #生成你要創建的數據對象 11 print(user_obj.name,user_obj.id) #此時還沒創建對象呢,不信你打印一下id發現還是None 12 13 Session.add(user_obj) #把要創建的數據對象添加到這個session里, 一會統一創建 14 Session.add(user_obj2) #把要創建的數據對象添加到這個session里, 一會統一創建 15 print(user_obj.name,user_obj.id) #此時也依然還沒創建 16 17 Session.commit() #現此才統一提交,創建數據
# =========================================================================
# 查詢數據
# =========================================================================
在查詢之前修改部分代碼:
1 #=========================================================================== 2 #查詢數據 3 #=========================================================================== 4 class User(Base): 5 __tablename__ = 'user' #表名 6 id = Column(Integer, primary_key=True) 7 name = Column(String(32)) 8 password = Column(String(64)) 9 10 def __repr__(self): 11 return "<%s name :%s>" %(self.id,self.name)
1 # ========================================================================= 2 # 查詢所有的數據 3 # ========================================================================= 4 data = Session.query(User).filter_by().all() 5 print(data) 6 #查詢數據 7 data = Session.query(User).filter_by(name="NEOKARL").all() 8 print(data[0].name,data[0].password) 9 #查詢id>2的所有數據 10 data = Session.query(User).filter(User.id >2).all() 11 print(data[0].name,data[0].password) 12 13 #查詢id=2的所有數據 14 data = Session.query(User).filter_by(id = 2).all() 15 print(data[0].name,data[0].password) 16 17 data = Session.query(User).filter(User.id==2).all() 18 print(data[0].name,data[0].password) 19 20 #多條件查詢: 21 data = Session.query(User).filter(User.id>2).filter(User.id<5).all() 22 print(data[0].name,data[0].password)
1 # ========================================================================= 2 # 修改 3 # ========================================================================= 4 my_user = Session.query(User).filter_by(name="NEOKARL").first() 5 my_user.name = "PerfectWanan" 6 Session.commit() 7 00 8 # ========================================================================= 9 # 回滾 10 # ========================================================================= 11 12 fake_user = User(name='Rain', password='12345') 13 Session.add(fake_user) 14 15 print(Session.query(User).filter(User.name.in_(['Jack','rain'])).all() ) #這時看session里有你剛添加和修改的數據 16 17 Session.rollback() #此時你rollback一下 18 19 print(Session.query(User).filter(User.name.in_(['Jack','rain'])).all() ) #再查就發現剛才添加的數據沒有了。 20 21 # ========================================================================= 22 # 分組統計 23 # ========================================================================= 24 print(Session.query(User).filter(User.name.in_(['Jack','rain'])).count()) 25 # from sqlalchemy import func 26 # print(Session.query(func.count(User.name),User.name).group_by(User.name).all() ) 27 # ========================================================================= 28 # 鏈表 29 # ========================================================================= 30 s1 = Student(name = "3333",age = "55",register_date = "2018-5-25") 31 Session.add(s1) 32 Session.commit() 33 # ========================================================================= 34 # join連表查詢 35 # ========================================================================= 36 print(Session.query(User,Student).filter(User.id == Student.stu_id).all()) 37 # 需要有外部關聯才能查詢 38 # print(Session.query(User).join(Student).all())
外鍵關聯:
1 import sqlalchemy 2 from sqlalchemy import create_engine 3 from sqlalchemy.ext.declarative import declarative_base 4 from sqlalchemy import Column, Integer, String 5 # 需要導入其他的模塊 6 from sqlalchemy.orm import sessionmaker 7 # 我們創建一個表,跟student表關聯 8 from sqlalchemy import ForeignKey 9 from sqlalchemy.orm import relationship 10 # 創建一個表 11 # 如果已經創建了就不再需要創建了 12 engine = create_engine("mysql+pymysql://LOCALHOST:123456@localhost/lll", 13 encoding='utf-8')#如果不echo = true 就不打印 14 15 Base = declarative_base() #生成orm基類 16 17 class Student(Base): 18 __tablename__ = 'student' 19 stu_id = Column(Integer, primary_key=True) 20 name = Column(String(32), nullable=False) 21 age = Column(String(32), nullable=False) 22 register_date = Column(String(32), nullable=False) 23 24 # user = relationship("User", backref="addresses") #這個nb,允許你在user表里通過backref字段反向查出所有它在addresses表里的關聯項 25 26 def __repr__(self): 27 return "<%s name :%s>" %(self.stu_id,self.name) 28 29 class StudyRecord(Base): 30 __tablename__ = 'study_record' 31 id = Column(Integer, primary_key=True) 32 day = Column(Integer,nullable=False) 33 status = Column(String(32),nullable=False) 34 35 #=========================================================== 36 student = relationship("Student", backref="my_study_record") 37 38 #student = query(Student).filter(Student.id == stu_obj.stu_id).first() 39 #=========================================================== 40 #外鍵關聯 41 stu_id = Column(Integer,ForeignKey("student.stu_id")) 42 43 def __repr__(self): 44 return "<%s day :%s status:%s>" %(self.student.name,self.day,self.status) 45 46 Base.metadata.create_all(engine) #創建表結構 47 48 # 最基本的表我們創建好了,那我們開始用orm創建一條數據試試 49 Session_class = sessionmaker(bind = engine) #創建與數據庫的會話session class ,注意,這里返回給session的是個class,不是實例 50 Session = Session_class() #生成session實例 51 52 # s1 = Student(name = "jack",age = "5551",register_date = "2018-5-25") 53 # s2 = Student(name = "neo",age = "5552",register_date = "2018-5-26") 54 # s3 = Student(name = "karl",age = "5553",register_date = "2018-5-27") 55 # s4 = Student(name = "perfectwanan",age = "5554",register_date = "2018-5-28") 56 57 # study_obj1 = StudyRecord(day = 1,status = "YES",stu_id = 3) 58 # study_obj2 = StudyRecord(day = 2,status = "NO",stu_id = 3) 59 # study_obj3 = StudyRecord(day = 3,status = "YES",stu_id = 3) 60 # study_obj4 = StudyRecord(day = 3,status = "YES",stu_id = 4) 61 62 # Session.add_all([s1,s2,s3,s4,study_obj1,study_obj2,study_obj3,study_obj4]) 63 64 study_obj = Session.query(Student).filter(Student.name == "neo").first() 65 print(study_obj.my_study_record) 66 67 68 Session.commit()
#===========================================================================
#結果:[<neo day :1 status:YES>, <neo day :2 status:NO>, <neo day :3 status:YES>]
#===========================================================================
需要注意的是:
我的數據表為:
#===========================================================================
#sqlalchemy 多外鍵關聯
#===========================================================================
orm_many_fk.py
1 import sqlalchemy 2 from sqlalchemy import create_engine 3 from sqlalchemy.ext.declarative import declarative_base 4 from sqlalchemy import Column, Integer, String 5 # 需要導入其他的模塊 6 from sqlalchemy.orm import sessionmaker 7 # 我們創建一個表,跟student表關聯 8 from sqlalchemy import ForeignKey 9 from sqlalchemy.orm import relationship 10 engine = create_engine("mysql+pymysql://LOCALHOST:123456@localhost/lll", 11 encoding='utf-8',echo = True)#如果不echo = true 就不打印 12 Base = declarative_base() 13 14 class Customer(Base): 15 __tablename__ = 'customer' 16 id = Column(Integer, primary_key=True) 17 name = Column(String(64)) 18 19 billing_address_id = Column(Integer, ForeignKey("address.id")) 20 shipping_address_id = Column(Integer, ForeignKey("address.id")) 21 22 billing_address = relationship("Address", foreign_keys=[billing_address_id]) 23 shipping_address = relationship("Address", foreign_keys=[shipping_address_id]) 24 25 class Address(Base): 26 __tablename__ = 'address' 27 id = Column(Integer, primary_key=True) 28 street = Column(String(64)) 29 city = Column(String(64)) 30 state = Column(String(64)) 31 Base.metadata.create_all(engine) #創建表結構
orm_api.py
1 import orm_many_fk 2 # 需要導入其他的模塊 3 from sqlalchemy.orm import sessionmaker 4 # 最基本的表我們創建好了,那我們開始用orm創建一條數據試試 5 Session_class = sessionmaker(bind = orm_many_fk.engine) #創建與數據庫的會話session class ,注意,這里返回給session的是個class,不是實例 6 Session = Session_class() #生成session實例 7 8 addr1 = orm_many_fk.Address(street = "Tiantongyuan",city = "Changping",state = "BJ") 9 addr2 = orm_many_fk.Address(street = "Wudaokou",city = "Haidian",state = "BJ") 10 addr3 = orm_many_fk.Address(street = "Yanjiao",city = "Langfang",state = "HB") 11 12 Session.add_all([addr1,addr2,addr3]) 13 14 c1 = orm_many_fk.Customer(name = "wanan",billing_address= addr1,shipping_address = addr2) 15 c2 = orm_many_fk.Customer(name = "jcak",billing_address= addr3,shipping_address = addr2) 16 17 Session.add_all([c1,c2])
#===========================================================================
#如果出現以下問題提示
#===========================================================================
sqlalchemy.exc.AmbiguousForeignKeysError: Could
not
determine join
condition between parent
/
child tables on relationship
Customer.billing_address
-
there are multiple foreign key
paths linking the tables. Specify the
'foreign_keys'
argument,
providing a
list
of those columns which should be
counted as containing a foreign key reference to the parent table.
#===========================================================================
1 class Customer(Base): 2 __tablename__ = 'customer' 3 id = Column(Integer, primary_key=True) 4 name = Column(String(64)) 5 6 billing_address_id = Column(Integer, ForeignKey("address.id")) 7 shipping_address_id = Column(Integer, ForeignKey("address.id")) 8 9 billing_address = relationship("Address", foreign_keys=[billing_address_id]) 10 shipping_address = relationship("Address", foreign_keys=[shipping_address_id])
這樣sqlachemy就能分清哪個外鍵是對應哪個字段了
#===========================================================================
#sqlalchemy 多對多外鍵關聯
#===========================================================================
1 #一本書可以有多個作者,一個作者又可以出版多本書 2 from sqlalchemy import Table, Column, Integer,String,DATE, ForeignKey 3 from sqlalchemy.orm import relationship 4 from sqlalchemy.ext.declarative import declarative_base 5 from sqlalchemy import create_engine 6 from sqlalchemy.orm import sessionmaker 7 Base = declarative_base() 8 9 book_m2m_author = Table('book_m2m_author', Base.metadata, 10 Column('book_id',Integer,ForeignKey('books.id')), 11 Column('author_id',Integer,ForeignKey('authors.id')), 12 ) 13 14 class Book(Base): 15 __tablename__ = 'books' 16 id = Column(Integer,primary_key=True) 17 name = Column(String(64)) 18 pub_date = Column(DATE) 19 authors = relationship('Author',secondary=book_m2m_author,backref='books') 20 21 def __repr__(self): 22 return self.name 23 24 class Author(Base): 25 __tablename__ = 'authors' 26 id = Column(Integer, primary_key=True) 27 name = Column(String(32)) 28 29 def __repr__(self): 30 return self.name 31 # 創建一個表 32 # 如果已經創建了就不再需要創建了 33 engine = create_engine("mysql+pymysql://LOCALHOST:123456@localhost/lll", 34 encoding='utf-8')#如果不echo = true 就不打印
1 import orm_mtom 2 from sqlalchemy.orm import sessionmaker 3 # 最基本的表我們創建好了,那我們開始用orm創建一條數據試試 4 Session_class = sessionmaker(bind = orm_mtom.engine) #創建與數據庫的會話session class ,注意,這里返回給session的是個class,不是實例 5 s = Session_class() #生成session實例 6 7 # b1 = Book(name="跟0學Python") 8 # b2 = Book(name="跟0學把妹") 9 # b3 = Book(name="跟0學裝逼") 10 # b4 = Book(name="跟0學開車") 11 12 # a1 = Author(name="Alex") 13 # a2 = Author(name="Jack") 14 # a3 = Author(name="Rain") 15 16 # b1.authors = [a1,a2] 17 # b2.authors = [a1,a2,a3] 18 19 # s.add_all([b1,b2,b3,b4,a1,a2,a3]) 20 21 print('--------通過書表查關聯的作者---------') 22 23 book_obj = s.query(Book).filter_by(name="跟0學Python").first() 24 print(book_obj.name, book_obj.authors) 25 print('--------通過作者表查關聯的書---------') 26 author_obj =s.query(Author).filter_by(name="0").first() 27 print(author_obj.name , author_obj.books) 28 29 s.commit()