#-*-coding:utf-8-*- #__author__ = "logan.xu" import sqlalchemy from sqlalchemy import create_engine,func from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column,Integer,String,ForeignKey,DATE from sqlalchemy.orm import sessionmaker,relationship engine=create_engine("mysql+pymysql://root:12345678@localhost/news",encoding='utf-8',echo=True) Base=declarative_base() class Customer(Base): __tablename__ = 'customer' id = Column(Integer, primary_key=True) name = Column(String(64)) # 以Address表id字段 設置兩個外鍵 billing_address_id = Column(Integer, ForeignKey("address.id")) shipping_address_id = Column(Integer, ForeignKey("address.id")) # relationship -容許你在Student表裏經過backref字段反向查出全部它在表裏的關聯項- # foreign_keys=綁定外鍵 屢次relationship 反差會識別不出指定數據因此添加foreign_keys參數。 billing_address = relationship("Address",foreign_keys=[billing_address_id]) shipping_address = relationship("Address",foreign_keys=[shipping_address_id]) class Address(Base): __tablename__ = 'address' id = Column(Integer, primary_key=True) street = Column(String(64)) city = Column(String(64)) state = Column(String(64)) # 返回一個能夠用來表示對象的可打印字符串 def __repr__(self): return self.street #---------------1.建立表-----------------# # 建立表結構 Base.metadata.create_all(engine) #---------------------------------------# # bind=engine 綁定engine socket實例 #Session_class = sessionmaker(bind=engine) # 生成session實例,如同pymysql內的cursor #Session = Session_class() #---------------2.寫入數據-----------------# # 寫入數據 # addr1 = orm_fk.Address(street="Tiantongyuan",city="ChangPing",state="BJ") # addr2 = orm_fk.Address(street="Wudaokou",city="Haidian",state="BJ") # addr3 = orm_fk.Address(street="Yanjiao",city="Langfang",state="HB") # 插入數據 # Session.add_all([addr1,addr2,addr3]) # 寫入數據 並調用 Address字段插入數據 爲 Customer數據 # c1 = orm_fk.Customer(name="kevin",billing_address=addr1,shipping_address=addr2) # c2 = orm_fk.Customer(name="Jack",billing_address=addr3,shipping_address=addr3) # 插入數據 # Session.add_all([c1,c2]) #---------------------------------------# #---------------3.查詢數據-----------------# # 取出Customer內的 內存對象 #obj = Session.query(Customer).filter(Customer.name=="kevin").first() # 經過內存 調用第一行name字段數據, # 調用billing_address對應外鍵id的對應數據, # 調用obj.shipping_address對應外鍵id的對應數據。 #print(obj.name,obj.billing_address,obj.shipping_address) #---------------------------------------# # 執行事務 #Session.commit()
/Users/drizzle/PycharmProjects/2018-12-03/venv/bin/python /Users/drizzle/PycharmProjects/2018-12-03/test_1/orm_api.py 2019-01-08 19:07:49,013 INFO sqlalchemy.engine.base.Engine SHOW VARIABLES LIKE 'sql_mode' 2019-01-08 19:07:49,013 INFO sqlalchemy.engine.base.Engine {} 2019-01-08 19:07:49,015 INFO sqlalchemy.engine.base.Engine SHOW VARIABLES LIKE 'lower_case_table_names' 2019-01-08 19:07:49,015 INFO sqlalchemy.engine.base.Engine {} 2019-01-08 19:07:49,017 INFO sqlalchemy.engine.base.Engine SELECT DATABASE() 2019-01-08 19:07:49,017 INFO sqlalchemy.engine.base.Engine {} 2019-01-08 19:07:49,018 INFO sqlalchemy.engine.base.Engine show collation where `Charset` = 'utf8mb4' and `Collation` = 'utf8mb4_bin' 2019-01-08 19:07:49,018 INFO sqlalchemy.engine.base.Engine {} 2019-01-08 19:07:49,020 INFO sqlalchemy.engine.base.Engine SELECT CAST('test plain returns' AS CHAR(60)) AS anon_1 2019-01-08 19:07:49,020 INFO sqlalchemy.engine.base.Engine {} 2019-01-08 19:07:49,021 INFO sqlalchemy.engine.base.Engine SELECT CAST('test unicode returns' AS CHAR(60)) AS anon_1 2019-01-08 19:07:49,021 INFO sqlalchemy.engine.base.Engine {} 2019-01-08 19:07:49,022 INFO sqlalchemy.engine.base.Engine SELECT CAST('test collated returns' AS CHAR CHARACTER SET utf8mb4)
COLLATE utf8mb4_bin AS anon_1 2019-01-08 19:07:49,022 INFO sqlalchemy.engine.base.Engine {} 2019-01-08 19:07:49,023 INFO sqlalchemy.engine.base.Engine DESCRIBE `customer` 2019-01-08 19:07:49,023 INFO sqlalchemy.engine.base.Engine {} 2019-01-08 19:07:49,024 INFO sqlalchemy.engine.base.Engine DESCRIBE `address` 2019-01-08 19:07:49,024 INFO sqlalchemy.engine.base.Engine {} 2019-01-08 19:07:49,030 INFO sqlalchemy.engine.base.Engine BEGIN (implicit) 2019-01-08 19:07:49,031 INFO sqlalchemy.engine.base.Engine INSERT INTO address (street, city, state) VALUES (%(street)s, %(city)s, %(state)s) 2019-01-08 19:07:49,031 INFO sqlalchemy.engine.base.Engine {'street': 'tiantongyuan', 'city': 'changping', 'state': 'BJ'} 2019-01-08 19:07:49,032 INFO sqlalchemy.engine.base.Engine INSERT INTO address (street, city, state) VALUES (%(street)s, %(city)s, %(state)s) 2019-01-08 19:07:49,032 INFO sqlalchemy.engine.base.Engine {'street': 'wudaokou', 'city': 'haidian', 'state': 'BJ'} 2019-01-08 19:07:49,033 INFO sqlalchemy.engine.base.Engine INSERT INTO address (street, city, state) VALUES (%(street)s, %(city)s, %(state)s) 2019-01-08 19:07:49,033 INFO sqlalchemy.engine.base.Engine {'street': 'yanjiao', 'city': 'langfang', 'state': 'BJ'} 2019-01-08 19:07:49,034 INFO sqlalchemy.engine.base.Engine INSERT INTO customer (name, billing_address_id, shipping_address_id) VALUES (%(name)s,
%(billing_address_id)s, %(shipping_address_id)s) 2019-01-08 19:07:49,034 INFO sqlalchemy.engine.base.Engine {'name': 'Alex', 'billing_address_id': 1, 'shipping_address_id': 2} 2019-01-08 19:07:49,035 INFO sqlalchemy.engine.base.Engine INSERT INTO customer (name, billing_address_id, shipping_address_id) VALUES (%(name)s,
%(billing_address_id)s, %(shipping_address_id)s) 2019-01-08 19:07:49,035 INFO sqlalchemy.engine.base.Engine {'name': 'Jack', 'billing_address_id': 3, 'shipping_address_id': 3} 2019-01-08 19:07:49,035 INFO sqlalchemy.engine.base.Engine COMMIT Process finished with exit code 0
mysql> show tables; +----------------+ | Tables_in_news | +----------------+ | address | | customer | | student | | study_record | | user | +----------------+ 5 rows in set (0.00 sec) mysql> select * from customer; +----+------+--------------------+---------------------+ | id | name | billing_address_id | shipping_address_id | +----+------+--------------------+---------------------+ | 1 | Alex | 1 | 2 | | 2 | Jack | 3 | 3 | +----+------+--------------------+---------------------+ 2 rows in set (0.00 sec) mysql> select * from address; +----+--------------+-----------+-------+ | id | street | city | state | +----+--------------+-----------+-------+ | 1 | tiantongyuan | changping | BJ | | 2 | wudaokou | haidian | BJ | | 3 | yanjiao | langfang | BJ | +----+--------------+-----------+-------+ 3 rows in set (0.00 sec)
#查詢
#-*-coding:utf-8-*- #__author__ = "logan.xu" from test_1 import orm_many_fk from sqlalchemy.orm import sessionmaker Session_class=sessionmaker(bind=orm_many_fk.engine) #建立與數據庫的連接 session= Session_class() #生成session實例 #cursor #addr1=orm_many_fk.Address(street="tiantongyuan",city="changping",state="BJ") #addr2=orm_many_fk.Address(street="wudaokou",city="haidian",state="BJ") #add#r3=orm_many_fk.Address(street="yanjiao",city="langfang",state="BJ") # #session.add_all([addr1,addr2,addr3]) #c1= orm_many_fk.Customer(name="Alex",billing_address=addr1,shipping_address=addr2) #c2= orm_many_fk.Customer(name="Jack",billing_address=addr3,shipping_address=addr3) #session.add_all([c1,c2]) #查詢 obj=session.query(orm_many_fk.Customer).filter(orm_many_fk.Customer.name=="alex").first() print(obj.name,obj.billing_address,obj.shipping_address) session.commit()
/Users/drizzle/PycharmProjects/2018-12-03/venv/bin/python /Users/drizzle/PycharmProjects/2018-12-03/test_1/orm_api.py 2019-01-08 19:15:17,840 INFO sqlalchemy.engine.base.Engine SHOW VARIABLES LIKE 'sql_mode' 2019-01-08 19:15:17,840 INFO sqlalchemy.engine.base.Engine {} 2019-01-08 19:15:17,842 INFO sqlalchemy.engine.base.Engine SHOW VARIABLES LIKE 'lower_case_table_names' 2019-01-08 19:15:17,842 INFO sqlalchemy.engine.base.Engine {} 2019-01-08 19:15:17,844 INFO sqlalchemy.engine.base.Engine SELECT DATABASE() 2019-01-08 19:15:17,844 INFO sqlalchemy.engine.base.Engine {} 2019-01-08 19:15:17,844 INFO sqlalchemy.engine.base.Engine show collation where `Charset` = 'utf8mb4' and `Collation` = 'utf8mb4_bin' 2019-01-08 19:15:17,844 INFO sqlalchemy.engine.base.Engine {} 2019-01-08 19:15:17,847 INFO sqlalchemy.engine.base.Engine SELECT CAST('test plain returns' AS CHAR(60)) AS anon_1 2019-01-08 19:15:17,847 INFO sqlalchemy.engine.base.Engine {} 2019-01-08 19:15:17,848 INFO sqlalchemy.engine.base.Engine SELECT CAST('test unicode returns' AS CHAR(60)) AS anon_1 2019-01-08 19:15:17,848 INFO sqlalchemy.engine.base.Engine {} 2019-01-08 19:15:17,849 INFO sqlalchemy.engine.base.Engine SELECT CAST('test collated returns' AS CHAR CHARACTER SET utf8mb4)
COLLATE utf8mb4_bin AS anon_1 2019-01-08 19:15:17,849 INFO sqlalchemy.engine.base.Engine {} 2019-01-08 19:15:17,850 INFO sqlalchemy.engine.base.Engine DESCRIBE `customer` 2019-01-08 19:15:17,850 INFO sqlalchemy.engine.base.Engine {} 2019-01-08 19:15:17,851 INFO sqlalchemy.engine.base.Engine DESCRIBE `address` 2019-01-08 19:15:17,851 INFO sqlalchemy.engine.base.Engine {} 2019-01-08 19:15:17,857 INFO sqlalchemy.engine.base.Engine BEGIN (implicit) 2019-01-08 19:15:17,858 INFO sqlalchemy.engine.base.Engine SELECT customer.id AS customer_id, customer.name AS customer_name,
customer.billing_address_id AS customer_billing_address_id, customer.shipping_address_id AS customer_shipping_address_id FROM customer WHERE customer.name = %(name_1)s LIMIT %(param_1)s 2019-01-08 19:15:17,858 INFO sqlalchemy.engine.base.Engine {'name_1': 'alex', 'param_1': 1} 2019-01-08 19:15:17,859 INFO sqlalchemy.engine.base.Engine SELECT address.id AS address_id, address.street AS address_street,
address.city AS address_city, address.state AS address_state FROM address WHERE address.id = %(param_1)s 2019-01-08 19:15:17,860 INFO sqlalchemy.engine.base.Engine {'param_1': 1} 2019-01-08 19:15:17,861 INFO sqlalchemy.engine.base.Engine SELECT address.id AS address_id, address.street AS address_street,
address.city AS address_city, address.state AS address_state FROM address WHERE address.id = %(param_1)s 2019-01-08 19:15:17,861 INFO sqlalchemy.engine.base.Engine {'param_1': 2} Alex tiantongyuan wudaokou 2019-01-08 19:15:17,862 INFO sqlalchemy.engine.base.Engine COMMIT Process finished with exit code 0