我的源代碼中的模型格式如下。字典中的陣列 字典中的陣列 字典中的陣列...
# data structure
user_list = [{user_name: 'A',
email: '[email protected]',
items:[{name:'a_itme1', properties:[{1....},{2....}...]}
]} * 100]
我正在嘗試使用 SQLAlchemy 將上述資料放入 postgresql 資料庫中。有用戶表、物體表和屬性表。并且有表格分別鏈接用戶和專案,以及專案和屬性。
for u in user_list:
new_user = User(user_name=u.get('user_name'),....)
session.add(new_user)
session.flush()
for item in u.get('items'):
new_item = Item(name=item.get('name'),.....)
session.add(new_item)
session.flush()
new_item_link = UserItemLink(user_id=new_user.id, item_id=new_item.id,...)
session.add(new_item_link)
session.flush()
for prop in item.properties:
new_properties = Properties(name=prop.get('name'),...)
session.add(new_properties)
session.flush()
new_prop_link = ItemPropLink(item_id=new_item.id, prop_id=new_properties.id,...)
session.add(new_prop_link)
session.flush()
session.commit()
我的模型如下所示:
class User(Base):
__tablename__ = 'user'
id = Column(Integer, Identity(always=True, start=1, increment=1, minvalue=1, maxvalue=2147483647, cycle=False, cache=1), primary_key=True)
name = Column(String(20))
email = Column(String(50))
user_item_link = relationship('UserItemLink', back_populates='user')
class Item(Base):
__tablename__ = 'item'
id = Column(Integer, Identity(always=True, start=1, increment=1, minvalue=1, maxvalue=2147483647, cycle=False, cache=1), primary_key=True)
name = Column(String(50))
note = Column(String(50))
user_item_link = relationship('UserItemLink', back_populates='item')
class Properties(Base):
__tablename__ = 'properties'
id = Column(Integer, Identity(always=True, start=1, increment=1, minvalue=1, maxvalue=2147483647, cycle=False, cache=1), primary_key=True)
name = Column(String(50))
value = Column(String(50))
item_prop_link = relationship('ItemPropLink', back_populates='properties')
class UserItemLink(Base):
__tablename__ = 'user_item_link'
id = Column(Integer, Identity(always=True, start=1, increment=1, minvalue=1, maxvalue=2147483647, cycle=False, cache=1), primary_key=True)
user_id = Column(ForeignKey('db.user.id'), nullable=False)
item_id = Column(ForeignKey('db.item.id'), nullable=False)
為了更好地理解,上述來源已被簡化。使用上述資訊順序執行 session.add() 時,會花費很多時間。當輸入 100 個用戶資訊時,會有 8 秒或更長的延遲。
請建議提高 python 速度和 sqlalchemy 速度。
uj5u.com熱心網友回復:
由于您在模型上配置了關系,因此您可以使用這些關系而不是依賴于 id 來組合復雜的物件:
with Session.begin() as s:
for u in user_list:
user_item_links = []
for item in u.get('items'):
item_prop_links = []
for prop in item['properties']:
item_prop_link = ItemPropLink()
item_prop_link.properties = Properties(name=prop.get('name'), value=prop.get('value'))
item_prop_links.append(item_prop_link)
item = Item(name=item.get('name'), item_prop_link=item_prop_links)
user_item_link = UserItemLink()
user_item_link.item = item
user_item_links.append(user_item_link)
new_user = User(name=u.get('user_name'), email=u.get('email'), user_item_link=user_item_links)
s.add(new_user)
SQLAlchemy 將在提交時重繪 會話時自動設定外鍵,無需手動重繪 。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/435989.html
標籤:Python 表现 for循环 sqlalchemy
