سؤال

لقد بدأت باستخدام 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'
....

بهذه الطريقة، يمكنك تجنب التعارضات مع الاصطلاحات الافتراضية لقاعدة البيانات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top