资深.NET程序员转Python新手:Python如何实现返回自定义对象获取客户记录?
嗨!作为同样从.NET转Python的开发者,我太懂你这种想找到熟悉模式的心情了——把数据库记录读取到自定义对象里,在Python里其实逻辑和.NET很像,咱们一步步来实现:
在Python中实现数据库读取并返回自定义对象
1. 定义你的Customer类
类比.NET里的自定义实体对象,Python用class来定义。如果是Python 3.7及以上版本,非常推荐用dataclass,它能帮你省去写__init__方法的冗余代码,和.NET里的POCO类写法几乎一致:
from dataclasses import dataclass @dataclass class Customer: id: int name: str email: str phone: str # 在这里继续添加你需要的所有客户字段,和.NET的Customer对象一一对应即可
如果需要兼容更低版本的Python,就用传统的类定义方式:
class Customer: def __init__(self, id: int, name: str, email: str, phone: str): self.id = id self.name = name self.email = email self.phone = phone # 其他字段同理,逐个初始化
2. 实现读取数据库的ReadCustomerRecord函数
Python里操作数据库需要对应的驱动库,比如连接SQL Server用pyodbc(和.NET的ODBC逻辑类似)、PostgreSQL用psycopg2、MySQL用mysql-connector-python,内置的SQLite用sqlite3。这里以pyodbc连接SQL Server为例,逻辑和.NET的数据库操作完全对齐:
import pyodbc def ReadCustomerRecord(customer_id: int) -> Customer: # 数据库连接字符串,格式和.NET的连接串很像,替换成你的实际配置 conn_str = "DRIVER={ODBC Driver 17 for SQL Server};SERVER=你的服务器地址;DATABASE=你的数据库名;UID=用户名;PWD=密码" # 用with语句自动管理连接生命周期,不用手动关闭连接(类似.NET的using) with pyodbc.connect(conn_str) as conn: cursor = conn.cursor() # 一定要用参数化查询防止SQL注入!和.NET的参数化查询同样重要 cursor.execute("SELECT id, name, email, phone FROM Customers WHERE id = ?", (customer_id,)) # 获取单条记录 row = cursor.fetchone() if not row: # 没找到记录时,返回None或者抛出异常,根据你的业务需求来 return None # 把数据库行数据填充到Customer对象中 return Customer( id=row.id, name=row.name, email=row.email, phone=row.phone # 其他字段对应查询结果里的列名即可 )
3. 调用函数并使用对象
这一步和.NET的用法几乎一模一样:
# 读取ID为12345的客户记录 customer = ReadCustomerRecord(12345) if customer: print(f"客户姓名:{customer.name},联系邮箱:{customer.email}") # 直接通过对象属性访问字段,和.NET完全一致 else: print("未找到该客户记录")
额外进阶小技巧
- 如果你的
Customer字段特别多,手动写每个属性映射太麻烦,可以用解包语法——只要查询结果的列顺序和Customer类的参数顺序完全一致,就能简化成:return Customer(*row) - 如果你习惯了.NET里的Entity Framework,Python里也有对应的ORM框架,比如SQLAlchemy,它能自动完成数据库表和Python类的映射,省去手动写SQL和对象填充的步骤,示例如下:
from sqlalchemy import create_engine, Column, Integer, String from sqlalchemy.orm import declarative_base, sessionmaker Base = declarative_base() # 定义映射到数据库表的Customer类 class Customer(Base): __tablename__ = 'Customers' id = Column(Integer, primary_key=True) name = Column(String) email = Column(String) phone = Column(String) # 创建数据库引擎和会话 engine = create_engine("mssql+pyodbc://用户名:密码@服务器地址/数据库名?driver=ODBC+Driver+17+for+SQL+Server") Session = sessionmaker(bind=engine) def ReadCustomerRecord(customer_id: int) -> Customer: with Session() as session: # 直接通过类属性查询,完全不用写SQL return session.query(Customer).filter(Customer.id == customer_id).first()
内容的提问来源于stack exchange,提问作者biskit1967
相关产品推荐
相关产品推荐

