鱼C论坛

 找回密码
 立即注册
查看: 1297|回复: 4

关于pandas与mysql的连接问题

[复制链接]
发表于 2019-3-27 17:01:49 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
连接python及pandas与mysql时,遇到一个问题。。
不知道为什么connect命令没有问题,但是用create_engine,却会报错、。求解~~
1.jpg
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-3-27 19:19:08 From FishC Mobile | 显示全部楼层
第二个是sqlarchemy,是一个ORM,不是用游标执行sql语句,是把表映射成类class,使用类的方式来操作数据库。具体的查一下sqlalchemy吧,这个工具学习起来还是挺复杂……
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-28 16:10:31 | 显示全部楼层
天圆突破 发表于 2019-3-27 19:19
第二个是sqlarchemy,是一个ORM,不是用游标执行sql语句,是把表映射成类class,使用类的方式来操作数据库。 ...

不太理解。。同样是进行sql和python的连接,为什么要设置这么多个引擎?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-29 08:44:18 | 显示全部楼层
本帖最后由 天圆突破 于 2019-3-29 08:51 编辑
老笨啊 发表于 2019-3-28 16:10
不太理解。。同样是进行sql和python的连接,为什么要设置这么多个引擎?


mysql本来是自带的和python连接的模块,但是在python3以后就一直不太好用,所以有大神写了pymysql,解决了python和mysql连接的问题,这一点上,所有使用python的人都得拜这个大神。
pymysql使用的是和mysql自带的模块一样的方法,创建游标,然后用游标执行sql语句,这个方式是从mysql哪个官方模块来的,但这个方法有几个问题:
1. 对码农不友好,码农学个python还得去学sql语法,初级的select where还好些,跨表join起来那是跨的欲生欲死,更不用说什么外键,多对多,一对多,一对一,聚合,分组之类的了……
2. sql家族下的不同数据库mysql,sqlite等大体语法相同,但细微之处有不同,这还不如全不一样来着,简直恶意满满。
3. 我做个查询就要写个语句,代码重复率太高
4. 语法太丑,丑到惊天动地
5. 注入,注入

有这么多缺陷,就有聪明人相出了个办法,在“拼接字符串”的连接数据库只上,再封装一层,把丑陋无比的sql语句给隐藏起来,只使用python的方法来调用数据库,这就是ORM的由来。(ORM的底层本质上还是拼接sql命令字符串,只不过他都把sql命令字符串给隐藏起来了)
以sqlalchemy为例(抄一个我去年写的小项目)

  1. BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(sys.argv[0])))
  2. sys.path.append(BASE_DIR)

  3. from sqlite3 import dbapi2 as sqlite
  4. from sqlalchemy import create_engine, Column, String, Integer, BigInteger
  5. from sqlalchemy.orm import sessionmaker
  6. from sqlalchemy.ext.declarative import declarative_base
  7. # 这些都不用管

  8. Base = declarative_base()
  9. engine = create_engine('sqlite+pysqlite:///%s'%os.path.join(data_path, 'standard.db'), module=sqlite)
  10. session_obj = sessionmaker(bind=engine)

  11. engine2 = create_engine("mysql+%s://%s:%s@%s:%d/%s?charset=%s" % ('pymysql', 'root', '111111', '127.0.0.1', 3306, 'standard', 'utf8'), max_overflow=5)
  12. session_obj2 = sessionmaker(bind=engine2)
  13. # 上面连接了2个数据库,一个是mysql,一个是sqlite3,值得注意的是,连接mysql使用的是pymysql模块,也就是说,sqlalchemy底层拼接字符串调用的是pymysql的方法
  14. # 另一点是,不管是什么数据库,只要这个ORM支持,用的语法都一样!不管是mysql还是sqlite甚至Orcale(但就是没有微软全家桶)

  15. # 封装一个表
  16. class Enterprise(Base):
  17.     __tablename__ = 'enterprise'
  18.     id = Column(Integer, primary_key=True)
  19.     enterpriseName = Column(String(250), unique=True)  # 企业名称
  20.     orgCode = Column(String(18), unique=True)  # 信用代码
  21.     areaCode = Column(Integer, index=True)  # 行政区划代码
  22.     xzqh = Column(String(50), index=True)  # 行政区划
  23.     fddbr = Column(String(50))  # 法人
  24.     jgdz = Column(String(250))  # 地址
  25.     ...

  26. #这个class就是一个表,这是ORM的核心,把表转化成类,表里的字段使用类的属性来对应

  27. # 向表里插入数据示例:
  28. """
  29. 例如我有一个数据是字典形式
  30. dct = {
  31.     'enterpriseName': '123',
  32.     ...
  33. }
  34. """
  35. session = session_obj()  # 同样有游标,这点上我觉的Django的ORM更友好
  36. obj1 = Enterprise(**dct)
  37. session.add(obj1)
  38. session.commit()  # 支持事务
  39. # 一个sql语句也没写,只要会python语法,就能用ORM
复制代码


这就是两者的区别。
简单说,就是ORM(包括你上面用到的sqlalchemy)是在pymysql基础上进行的再一层的封装,让语法变得更友好,他会根据你的需求,调用自己写好的sql语句,进行你需要的数据库操作。
sqlchemy和DjangoORM是目前python上最好的两个ORM,但django-ORM不能脱离django环境使用,所以最好(也是最大)的ORM就是sqlalchemy了。如果需要数据库操作,学一个sqlalchemy就够了,但是sqllachemy的学习曲线相当陡,如果没接触过数据库,到了外键、跨表以后就很难继续下去了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-29 09:12:42 | 显示全部楼层
天圆突破 发表于 2019-3-29 08:44
mysql本来是自带的和python连接的模块,但是在python3以后就一直不太好用,所以有大神写了pymysql,解 ...

感谢大神。。
看得半懂不懂的。。比之前多了解了许多。。
后面学多了,用多了,再回来学习下。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-1-14 21:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表