قارورة sqlalchemy - الحد الأدنى من التطبيق
-
21-12-2019 - |
سؤال
لقد بدأت باستخدام Flask sqlalchemy، لكنني لا أفهم كيف يعمل العرض التوضيحي للصفحة الرئيسية (هنا).
سيؤدي هذا إلى إنشاء الهيكل:
>>> from yourapplication import db
>>> db.create_all()
لكنني لا أفهم مكان تخزين هؤلاء المستخدمين.
>>> from yourapplication import User
>>> admin = User('admin', 'admin@example.com')
>>> guest = User('guest', 'guest@example.com')
>>> db.session.add(admin)
>>> db.session.add(guest)
>>> db.session.commit()
لأنني إذا فعلت Select * from user;
سأجلب:
test=# \dt
List of relations
Schema | Name | Type | Owner
--------+------+-------+----------
public | user | table | postgres
(1 row)
test=# select * from user;
current_user
--------------
postgres
(1 row)
لكن الناتج هو المتوقع:
>>> users = User.query.all()
>>> [<User u'admin'>, <User u'guest'>]
اذا ماذا يحدث هنا؟يتم تخزين المستخدمين في ذاكرة التخزين المؤقت؟ذاكرة؟لأنني لا أرى أي مسؤول أو ضيف في user
طاولة .
المحلول
يستخدم Flask اسم الجدول المؤسف للغاية user
. هذه كلمة أساسية محجوزة في قاعدة البيانات;اسم مستعار للمدمج user
وظيفة، والتي هي بدورها اسم مستعار ل current_user
.لهذا السبب تحصل على اسم العمود current_user
عندما انت select * from user
;أنت حقًا تقوم بتشغيل الوظيفة الزائفة current_user
.
يصبح هذا أكثر إرباكًا بسبب حقيقة أن "المستخدم" لا يستخدم بناء جملة دالة SQL، فهو غير مزخرف، وبسبب حقيقة أنه تمت إعادة كتابته بواسطة المحلل اللغوي لذلك لا توجد وظيفة محددة بهذا الاسم بالفعل، ومن هنا جاءت النتيجة المربكة:
regress=> explain select * from user;
QUERY PLAN
--------------------------------------------------------------------
Function Scan on "current_user" (cost=0.00..0.01 rows=1 width=64)
(1 row)
إذا كنت تريد الوصف أو الاختيار من الجدول المحدد بواسطة المستخدم المسمى user
يجب عليك، وفقًا للوثائق الخاصة بالكلمات المحجوزة، أن تقتبسها.لذا يجب عليك أن تكتب:
select * from "user";
أو
select * from public."user";
(مخطط مؤهل).
بصورة مماثلة:
\dt "user"
سيظهر هيكل الجدول.
الرجاء الإبلاغ عن خطأ ضد Flask.يجب ألا يستخدم كلمة SQL-92 المحجوزة كاسم علاقة.
يحرر:يقوم Flask بإنشاء جدول يسمى "المستخدم" لأن اسم الفئة هو المستخدم.لتجنب ذلك، يوصى بتوفير __tablename__
الخيار أثناء تحديد النموذج.
class User(db.Model):
__tablename__= 'MyUser'
....
بهذه الطريقة، يمكنك تجنب التعارضات مع الاصطلاحات الافتراضية لقاعدة البيانات.