欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

Python中使用SQLAlchemy连接Mysql数据库(单表操作)

程序员文章站 2022-06-04 17:31:43
...

一,SQLAlchemy的安装 使用 $ easy_install sqlalchemy或 $ pip install sqlalchemy 如果出现什么错,就进去root用户下进行安装试试,或者网上查查 import sqlalchemy 这样说明成功了,切记是小写哦 二,使用 理论我也不懂,自己查查资料,现在用一个小的案

一,SQLAlchemy的安装
使用

$ easy_install sqlalchemy
或
$ pip install sqlalchemy

如果出现什么错,就进去root用户下进行安装试试,或者网上查查

>>> import sqlalchemy
>>> 

这样说明成功了,切记是小写哦
二,使用
理论我也不懂,自己查查资料,现在用一个小的案例说一下使用步骤
1,在进行数据操作之前要先连上数据库。

>>> from sqlalchemy import create_engine
>>> from sqlalchemy.orm import sessionmaker  
>>> DB_CONNECT = 'mysql+mysqldb://root:102@localhost/mydb'
>>> engine = create_engine(DB_CONNECT, echo=True)
>>> DB_Session = sessionmaker(bind=engine)
>>> session = DB_Session()

from 是从sqlalchemy中插入必须的模板,DB_CONNECT 是构造数据库的路径 ,mysql+mysqldb是说明使用MySQL-Python 来连接,root是数据库用户名,102是密码,localhost表示是数据库在本机上,mydb是要连接的数据库名字,设置字符集的charset可以省了
create_engine() 会返回一个数据库引擎,echo 参数为 True 时,会显示每条执行的 SQL 语句,生产环境下可关闭。
sessionmaker(bind=engine)会生成一个数据库会话类。这个类的实例可以当成一个数据库连接,它同时还记录了一些查询的数据,并决定什么时候执行 SQL 语句。由于 SQLAlchemy 自己维护了一个数据库连接池(默认 5 个连接),也可以自己设置。
得到session 后,就可以执行 SQL 了:
2,在进行操作前先把表给建立了,由于SQLAlchemy 可以和变进行建立连接并且可以通过语言进行见表

mysql> show tables;
Empty set (0.00 sec)
mysql> 

此时是没有表的,现在我们建立一个学生便stu,一个课程表cla和一个成绩表grade

>>> from sqlalchemy import Column
>>> from sqlalchemy.types import CHAR, Integer, String
>>> from sqlalchemy.ext.declarative import declarative_base
>>> from random import randint
>>> from sqlalchemy import ForeignKey
>>> BaseModel = declarative_base()
>>> def init_db():
...     BaseModel.metadata.create_all(engine)
... 
>>> def drop_db():
...     BaseModel.metadata.drop_all()
... 
>>> class Stu(BaseModel):
...     __tablename__='stu'
...     id = Column(Integer,primary_key = True)
...     name = Column(CHAR(30))
... 
>>> class Cla(BaseModel):
...     __tablename__='cla'
...     id = Column(Integer,primary_key = True)设置主键
...     cname = Column(CHAR(30))
... 
>>> class Grade(BaseModel):
...     __tablename__ = 'grade'
...     uid = Column(Integer,ForeignKey('stu.id'))设置外键
...     cid = Column(Integer,ForeignKey('cla.id'))
...     id = Column(Integer,primary_key=True)
...     gre=Column(Integer)
... 

declarative_base() 创建了一个 BaseModel 类,这个类的子类可以自动与一个表关联。以 Stu 类为例,它的 tablename 属性就是数据库中该表的名称,它有 id 和 name 这两个字段,分别为整型和 30 个定长字符。Column 还有一些其他的参数,我就不解释了。
最后,BaseModel.metadata.create_all(engine) 会找到 BaseModel 的所有子类,并在数据库中建立这些表;drop_all() 则是删除这些表。
现在执行init_db()进行建立表,对应语句如下

>>> init_db()
CREATE TABLE stu (
    id INTEGER NOT NULL AUTO_INCREMENT, 
    name CHAR(30), 
    PRIMARY KEY (id)
)

CREATE TABLE cla (
    id INTEGER NOT NULL AUTO_INCREMENT, 
    cname CHAR(30), 
    PRIMARY KEY (id)
)
CREATE TABLE grade (
    id INTEGER NOT NULL AUTO_INCREMENT, 
    uid INTEGER, 
    cid INTEGER, 
    gre INTEGER, 
    PRIMARY KEY (id), 
    FOREIGN KEY(uid) REFERENCES stu (id), 
    FOREIGN KEY(cid) REFERENCES cla (id)
)
COMMIT
>>> 

以上就是执行时对应的建表语句,现在去数据库看看表是否存在,并查看一个表结构

mysql> show tables;
+----------------+
| Tables_in_mydb |
+----------------+
| cla            |
| grade          |
| stu            |
+----------------+
3 rows in set (0.00 sec)

表已经建立成功了,现在看一下表结构

mysql> desc grade;
+-------+---------+------+-----+---------+----------------+
| Field | Type    | Null | Key | Default | Extra          |
+-------+---------+------+-----+---------+----------------+
| id    | int(11) | NO   | PRI | NULL    | auto_increment |
| uid   | int(11) | YES  | MUL | NULL    |                |
| cid   | int(11) | YES  | MUL | NULL    |                |
| gre   | int(11) | YES  |     | NULL    |                |
+-------+---------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

可以看出 使用SQLAlchemy中的语句和使用SQL语句的结果一样。接下来就可以插入数据了

>>> stu = Stu(name='a')
>>> session.add(stu)
>>> stu = Stu(name='b')
>>> session.add(stu)
>>> stu = Stu(name='c')
>>> session.add(stu)
>>> stu = Stu(name='d')
>>> session.add(stu)
>>> stu = Stu(name='e')
>>> session.add(stu)
>>> 

手动插入了五条记录,但此时还没有提交,没有真正的写入数据库
或者使用非ORM方式进行插入

>>>session.execute(Stu.__table__.insert(),[{'name':randint(1,100)} for i in xrange(10000)])
>>>session.commit()
#可以速度更快的插入更多的数据
>>> session.commit()
2016-05-09 18:22:16,839 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
2016-05-09 18:22:16,840 INFO sqlalchemy.engine.base.Engine INSERT INTO stu (name) VALUES (%s)
2016-05-09 18:22:16,840 INFO sqlalchemy.engine.base.Engine ('a',)
2016-05-09 18:22:16,841 INFO sqlalchemy.engine.base.Engine INSERT INTO stu (name) VALUES (%s)
2016-05-09 18:22:16,841 INFO sqlalchemy.engine.base.Engine ('b',)
2016-05-09 18:22:16,841 INFO sqlalchemy.engine.base.Engine INSERT INTO stu (name) VALUES (%s)
2016-05-09 18:22:16,841 INFO sqlalchemy.engine.base.Engine ('c',)
2016-05-09 18:22:16,842 INFO sqlalchemy.engine.base.Engine INSERT INTO stu (name) VALUES (%s)
2016-05-09 18:22:16,842 INFO sqlalchemy.engine.base.Engine ('d',)
2016-05-09 18:22:16,842 INFO sqlalchemy.engine.base.Engine INSERT INTO stu (name) VALUES (%s)
2016-05-09 18:22:16,842 INFO sqlalchemy.engine.base.Engine ('e',)
2016-05-09 18:22:16,843 INFO sqlalchemy.engine.base.Engine COMMIT
>>> 

此时真的写入数据库了哦。向课程表插入五条

>>> cla = Cla(cname='yuwen')
>>> session.add(cla)
>>> cla = Cla(cname='shuxue')
>>> session.add(cla)
>>> cla = Cla(cname='yingyu')
>>> session.add(cla)
>>> cla = Cla(cname='wuli')
>>> session.add(cla)
>>> cla = Cla(cname='huaxue')
>>> session.add(cla)
>>> session.commit()

3,现在开始操作数据

>>> query = session.query(Stu)
>>> for st in query:
...     print st.name
... 
对应的SQL语句
SELECT stu.id AS stu_id, stu.name AS stu_name 
FROM stu
2016-05-09 18:56:07,084 INFO sqlalchemy.engine.base.Engine ()
a
b
c
d
e
>>> print query.all()# # 返回的是一个类似列表的对象
SELECT stu.id AS stu_id, stu.name AS stu_name 
FROM stu
2016-05-09 18:58:16,085 INFO sqlalchemy.engine.base.Engine ()
[<__main__.stu class="hljs-built_in">object