
2.filter_by() 把等值过滤器添加到原查询上,返回一个新查询
3.limit 使用指定的值限定原查询返回的结果
4.offset() 偏移原查询返回的结果,返回一个新查询
5.order_by()根据指定条件对原查询结果进行排序,返回一个新查询
6.group_by()根据指定条件对原查询结果进行分组,返回一个新查询
1.all() 以列表形式返回查询的所有结果
2.first() 返回查询的第一个结果,如果未查到,返回None
3.first_or_404()返回查询的第一个结果,如果未查到,返回404
4.get() 返回指定主键对应的行,如不存在,返回None
5.get_or_404() 返回指定主键对应的行,如不存在,返回404
6.count() 返回查询结果的数量
7.paginate()返回一个Paginate对象,它包含指定范围内的结果
-pages一共多少页
-page当前页
-has_prev上一页
-has_next下一页
-iter_pages() 所有页数
-per_page 多少条数据
返回名字等于xiaobao的所有人
*关系属性是 sqlalchemy 封装的一套查询关联数据的语法, 其目的为 让开发者使用 面向对象的形式 方便快捷的获取关联数据
*关系属性的 本质仍是外键
*关系属性使用步骤:
定义关系属性
外键字段设置外键参数
通过关系属性获取关联数据
加载方法很简单,在所有的库文件后面添加上如下两句:手动添加的php的pdo的驱动扩展支持
extension=php_pdo.dll
extension=php_pdo_sqlite.dll
下面还有一个很重要的工作,就是我们要把扩展库的路径告诉php否则,PHP不知道去哪里找这些小宝贝了^_^ ,我们查找到如下的行:(查找关键字:extension_dir):
Directory in which the loadable extensions (modules) reside.
extension_dir = "c:\php\ext"
把它设置为动态库存方的路径,我们这里是:c:\php\ext
好了PHP的配置文件我们修改好了,保存关闭。
我们下面开始右击状态栏里面那个小羽毛的图标,选择“Open Apache Monitor”打开Apache监视窗口,我们选择右边一列按钮里面的“Stop”按钮,将服务暂时关掉。然后我们打开“开始-〉程序-〉Apache HTTP Server 2.0.54-〉Configure Apache Server-〉Edit the Apache httpd.conf Configuration File”菜单,打开Apache的配置文件httpd.conf。在这里面我们要把php当作Apache的一个模块加载进来。我们在配置文件的最后面加上如下两句。请注意路径问题哦:
LoadModule php5_module "c:/php/php5apache2.dll"
AddType application/x-httpd-php .php
这样当Apache启动的时候就把PHP加载进来了。再寻找下面的行
(查找关键字:DocumentRoot):
#
DocumentRoot "D:\website"
设置我们站点的根目录。我选在D:\website下面。
我们还要寻找如下的行:(查找关键字:DirectoryIndex)
#
DirectoryIndex index.html index.html.var
这里我们可以设置自己的首页名称,在后面加上我们使用的文件名即可.中间使用空格分隔。
例如:
#
DirectoryIndex index.html index.html.var index.php default.php
至此,我们所有的配置完成了,请大家保存关闭。然后再次启动Apache监视窗口,选择右边的“Start”按钮,启动Apache服务器,
最后拉~~
如果要测试SQLite数据库的话,我们使用一些SQLite建表工具,建一个数据库跟一些表,然后输入一些数据字段,最后使用自己喜欢的编辑器,在里面输入如下代码:
php
// Connect to an ODBC database using driver invocation
$dsn = 'sqlite:c:\sql.db'
try {
$dbh = new PDO($dsn, $user, $password)
echo 'PDO Connection Ok','
'
$dbh->exec("CREATE TABLE PKU(id integer,name varchar(255))")
echo 'Create Table ok','
'
$dbh->exec("INSERT INTO PKU values(1,'jarjin')")
echo 'Insert Data ok','
'
$dbh->beginTransaction()
$sth = $dbh->prepare('SELECT *FROM PKU')
$sth->execute()
$result = $sth->fetchAll()
print_r($result)
$dsn=null
} catch (PDOException $e) {
echo 'Connection failed: ' . $e->getMessage()
$dsn=null
}
?>
(注意:PHP5自身带的SQLite是2版本,不能执行3版本的连接跟 *** 作,POD就是解决这个问题的桥梁,它使PHP5连接并且 *** 作3版本的SQLite,因此,PHP5自身带的SQLite 函数库是无法 *** 作SQLIte3的,必须使用PHP5手册里面PDO的函数来间接驱动SQLite3数据库)
讲数据库 *** 作了创建表
首先,我们要让Flask-SQLAlchemy 根据模型类创建数据库。方法是使用db.create_all()
函数:
(venv) $ python hello.py shell
>>>from hello import db
>>>db.create_all()
插入行
下面这段代码创建了一些角色和用户:
>>>from hello import Role, User
>>>admin_role = Role(name='Admin')
>>>mod_role = Role(name='Moderator')
>>>user_role = Role(name='User')
>>>user_john = User(username='john', role=admin_role)#User类虽然没有role属性,但是在上一章节里面的Role里面设置了一个backref属性,就是用来反向作用的。
>>>user_susan = User(username='susan', role=user_role) #注意啊,这里的role=user_role针对的是上一章节里面说的,对应的是模型对象!不是键的值!!!
>>>user_david = User(username='david', role=user_role)
模型的构造函数接受的参数是使用关键字参数指定的模型属性初始值。注意,role 属性也可使用,虽然它不是真正的数据库列,但却是一对多关系的高级表示。这些新建对象的id属性并没有明确设定,因为主键是由Flask-SQLAlchemy 管理的。现在这些对象只存在于Python 中,还未写入数据库。因此id 尚未赋值:
>>>print(admin_role.id)
None
>>>print(mod_role.id)
None
>>>print(user_role.id)
None
通过数据库会话管理对数据库所做的改动,在Flask-SQLAlchemy 中,会话由db.session表示。准备把对象写入数据库之前,先要将其添加到会话中:
>>>db.session.add(admin_role)
>>>db.session.add(mod_role)
>>>db.session.add(user_role)
>>>db.session.add(user_john)
>>>db.session.add(user_susan)
>>>db.session.add(user_david)
或者简写成
db.session.add_all([admin_role, mod_role, user_role,
... user_john, user_susan, user_david])
这里的session首先是和前面章节讲的HTTP里面的session不一样的
不过我感觉作用是类似的,相当于一个缓存的作用,把实例化生成的对象存放在session里面
最后通过commit命令执行保存在数据库内。
db.session.commit()
接着,再去查看属性,已经有了
>>>print(admin_role.id)
1
>>>print(mod_role.id)
2
>>>print(user_role.id)
3
修改行
在数据库会话上调用add() 方法也能更新模型。我们继续在之前的shell 会话中进行 *** 作,下面这个例子把"Admin" 角色重命名为"Administrator":
>>>admin_role.name = 'Administrator'
>>>db.session.add(admin_role)
>>>db.session.commit()
删除行
数据库会话还有个delete() 方法。下面这个例子把"Moderator" 角色从数据库中删除:
>>>db.session.delete(mod_role)
>>>db.session.commit()
查询行
Flask-SQLAlchemy 为每个模型类都提供了query 对象。最基本的模型查询是取回对应表中
的所有记录:
>>>Role.query.all()
[<Role u'Administrator'>, <Role u'User'>]
>>>User.query.all()
[<User u'john'>, <User u'susan'>, <User u'david'>]
使用过滤器可以配置query 对象进行更精确的数据库查询。下面这个例子查找角色为"User" 的所有用户:
>>>User.query.filter_by(role=user_role).all()
[<User u'susan'>, <User u'david'>]
filter_by()等过滤器在query 对象上调用,返回一个更精确的query 对象。多个过滤器可以一起调用,直到获得所需结果。
关系和查询的处理方式类似。下面这个例子分别从关系的两端查询角色和用户之间的一对多关系:
>>>users = user_role.users
>>>users
[<User u'susan'>, <User u'david'>]
>>>users[0].role
<Role u'User'>
这个例子中的user_role.users 查询有个小问题。执行user_role.users 表达式时,隐含的查询会调用all() 返回一个用户列表。query 对象是隐藏的,因此无法指定更精确的查询
过滤器。就这个特定示例而言,返回一个按照字母顺序排序的用户列表可能更好。在示例5-4 中,我们修改了关系的设置,加入了lazy = 'dynamic' 参数,从而禁止自动执行查询。
示例5-4 hello.py:动态关系
class Role(db.Model):
# ...
users = db.relationship('User', backref='role', lazy='dynamic')
# ...
这样配置关系之后,user_role.users 会返回一个尚未执行的查询,因此可以在其上添加过
滤器:
>>>user_role.users.order_by(User.username).all()
[<User u'david'>, <User u'susan'>]
>>>user_role.users.count()
2
我的理解是,通过添加lazy参数后,他生成的对象就是不直接显示内容,而是要通过过滤器才能显示的。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)