Python中使用SQLAlchemy连接Mysql数据库(单表操作)
一,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
推荐阅读
-
Python使用Flask-SQLAlchemy连接数据库操作示例
-
Python使用sqlalchemy模块连接数据库操作示例
-
python中连接三大主流数据库mysql,mongodb和redis的操作教程
-
python数据库-MySQL单表查询基本操作(50)
-
Python使用Flask-SQLAlchemy连接数据库操作示例
-
Python中使用SQLAlchemy连接Mysql数据库(单表操作)
-
Python中使用SQLAlchemy连接Mysql数据库2(多表连接操作)
-
Python中使用SQLAlchemy连接Mysql数据库2(多表连接操作)
-
Python中使用SQLAlchemy连接Mysql数据库(单表操作)
-
mysql使用federated引擎实现远程访问数据库(跨网络同时操作两个数据库中的表)_MySQL