【发布时间】:2021-09-25 20:17:18
【问题描述】:
我使用 SQLAlchemy 的对象关系映射器编写了一个应用程序来存储和访问 SQLite3 数据库中的数据。
- 我可以拨打
add_user添加一个或多个用户,然后拨打get_users获取他们 - 我可以从 excel 中导入数据并使用
get_users获取它们 - 我可以从 excel 中导入数据并添加一个
add_user的用户 - 但是之后我无法使用
get_users函数获取用户,因为使用add_user创建的条目出现以下错误:AttributeError: 'NoneType' object has no attribute 'id'
我做错了什么?
这是应用程序的简单版本:
orm_test.py
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
def orm_setup():
Base = declarative_base()
engine = create_engine('sqlite:///:main:', echo=True)
Base.metadata.create_all(bind=engine)
Session = sessionmaker(bind=engine)
session = Session()
return Base, engine, session
orm_test_class.py
from sqlalchemy import Column, Integer, String
from orm_test import orm_setup
Base = orm_setup()[0]
engine = orm_setup()[1]
class User(Base):
__tablename__ = 'person'
id = Column('id', Integer, primary_key=True)
username = Column('username', String, unique=True)
Base.metadata.create_all(bind=engine)
orm_test_functions.py
from orm_test_class import User
from orm_test import orm_setup
session = orm_setup()[2]
def add_user(name):
u = User()
user_name = str(name)
u.username = user_name
session.add(u)
session.commit()
def get_users():
users = session.query(User).all()
for user in users:
print(user.id, user.username)
session.close()
main.py
import fire
from orm_test_functions import add_user, get_users
if __name__ == '__main__':
fire.Fire()
data_import.py
import fire
import pandas as pd
from orm_test import orm_setup
# import engine from orm
engine = orm_setup()[1]
def data_import():
file = 'Data.xlsx'
df_user = pd.read_excel(file, sheet_name = 'User')
df_user.to_sql('person', engine, if_exists='replace', index=False)
# Command line interface
if __name__ == '__main__':
fire.Fire()
【问题讨论】:
-
是的。我也可以使用包含 id 的 get_users 函数返回它们。
标签: python sqlite sqlalchemy orm